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

m3eecexj  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(360)

我在做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行大约需要半个小时(最短时间) LIMIT10,000 ). 如果我增加 LIMIT1,000,000 ,当reduce进程达到66.6%时,我的代码将被卡住。因为我有14亿行要处理,总时间对我来说太长了。有什么方法可以帮助提高这段代码的性能吗?谁能给点建议吗?
提前谢谢!

e5njpo68

e5njpo681#

您可能希望保存子查询

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的一般优化技巧

相关问题