我在做Hive,对它很陌生。
我正在努力提高以下代码的性能:
INSERT INTO target_table
(col1,col2,col3...) --- I have 64 columns in total
SELECT
t1.col1,t1.col2,t1.col3...
FROM (
SELECT
ts.col1,ts.col2,ts.col3...
FROM source_table ts
LEFT JOIN label_table tb
ON ( ts.colx = tb.colx AND ts.coly = tb.coly )
WHERE
ts.colx <> '' AND ts.colx <> 'NULL'
AND ts.colx IS NOT NULL
AND tb.colx IS NULL
LIMIT 10000
) t1
此代码的目标是将行插入到 target_table
,它们来自 source_table
谁的 colx
在中找不到 label_table
.
这个 source_table
包含大约14亿行和 label_table
有较少的行,但我将插入更多的行到 label_table
在未来(其行数最终将超过10亿)。
我的问题是:目前这个代码处理10000行大约需要半个小时(最短时间) LIMIT
是 10,000
). 如果我增加 LIMIT
至 1,000,000
,当reduce进程达到66.6%时,我的代码将被卡住。因为我有14亿行要处理,总时间对我来说太长了。有什么方法可以帮助提高这段代码的性能吗?谁能给点建议吗?
提前谢谢!
1条答案
按热度按时间e5njpo681#
您可能希望保存子查询
一个新的中间表,特别是当您需要多次使用这个中间数据时。然后可以对中间表进行进一步的优化,例如使用orc、分区和统计数据收集。
我还建议您避免在配置单元中加入表,它们是常见的性能问题。
最后看看这个指南,它提供了Hive的一般优化技巧