HiveQL运行太慢(需要提高性能)

时间:2018-06-25 06:32:26

标签: sql hive hiveql

我正在开发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_tableLIMIT)。如果将10,000增加到LIMIT,则在减少过程达到66.6%时,我的代码将被卡住。因为我有14亿行要处理,所以总时间对我来说太长了。有什么方法可以帮助提高此代码的性能?谁能给我些建议吗?

提前谢谢!

1 个答案:

答案 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提供一般优化提示