我正在开发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
中的行{{1}中找不到的source_table
中的行插入colx
中。
label_table
包含约14亿行,而source_table
的行较少,但将来我会在label_table
中插入更多行(其行数最终将超过10亿)
我的问题:目前,此代码将花费大约半小时来处理10,000行(label_table
是LIMIT
)。如果将10,000
增加到LIMIT
,则在减少过程达到66.6%时,我的代码将被卡住。因为我有14亿行要处理,所以总时间对我来说太长了。有什么方法可以帮助提高此代码的性能?谁能给我些建议吗?
提前谢谢!
答案 0 :(得分:0)
您可能想保存子查询
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
进入新的中间表,特别是如果您需要多次使用此中间数据时。然后,您可以对该中间表进行进一步的优化,例如使用ORC,分区或统计信息收集。
我还建议您避免在Hive中联接表,因为它们通常是性能问题。
最后查看this guide,为Hive提供一般优化提示