【发布时间】:2018-06-01 06:25:39
【问题描述】:
我想将一个大(超过 1.5 亿条记录和 700 列)表从一个 Hive 数据库转移到另一个,其中包括一些转换,例如在日期列上使用一个 cast,substr 在字符串列和一个简单的 case 语句上。
所以,是这样的:
-- initial settings
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.compress.intermediate=true;
SET hive.exec.parallel=true;
SET parquet.compression=SNAPPY;
SET hive.optimize.sort.dynamic.partition=true;
SET hive.merge.size.per.task=1000000000;
SET hive.merge.smallfiles.avgsize=1000000000;
INSERT INTO databaseA.tableName PARTITION(parition_col)
CASE WHEN a='Something' THEN 'SOMETHING'
WHEN a is null THEN 'Missing'
ELSE a END AS a,
column1,
column2,
...
cast(to_date(from_unixtime(unix_timestamp(),'yyyy-MM-dd')) AS string) AS
run_date,
substr(some_string, 1, 3)
FROM databaseB.tableName;
问题是这个查询会花费很多时间(每小时 100 万行)。也许有人知道如何加快速度?
我正在为此任务使用 map reduce 引擎。
谢谢!
【问题讨论】:
-
尝试将结果插入临时表,然后将其插入主表。
-
谢谢@Vamsi。现在好多了。还有其他改进的想法吗?
-
在 hive 中,将数据加载到不同的数据库或读取数据的同一数据库之间没有性能差异。 Hive 数据库通常指的是 hdfs 目录。就 SQL 而言,我看不出如何调整它。性能将取决于 HDFS 集群的大小。你试过运行这个吗?以及指标是什么?
-
这里最重要的是这个过程最终会生成一个大文件(20 GB)而不是几个小文件。此外,reduce 过程花费了大部分时间,所以上述设置可能有什么问题?为什么这么大的文件最终变成了一个大文件?在这个过程中有很多 mapper 和 reducer,reduce = 99% 需要几个小时。
标签: performance hive bigdata hiveql