如何在Hive上处理SQL中的数据偏斜?

时间:2018-09-26 08:25:24

标签: sql hadoop hive

我有两个表,netpack_busstop表有100,000,000,ic_card_trade的另一个表有100,000。我的查询SQL是这样的:

    SELECT
        count(*)
    FROM
        ic_card_trade tmpic
    LEFT JOIN netpack_busstop tmpnp 
    ON tmpic.line_no = tmpnp.line_no
    AND tmpic.bus_no = tmpnp.bus_no

我在使用hadoop上运行此作业的时间超过40分钟,时间太长了。

我想快速处理配置单元sql,用更少的时间。我不知道如何通过sql来实现。

2 个答案:

答案 0 :(得分:0)

由于您尚未在用于连接数据的列上创建任何索引,因此我认为您的执行计划包含对两个表的表扫描操作,这会降低性能。

我认为导致性能不佳的根本原因是缺少索引,这是一篇很好的文章-Indexes & Views in hive

答案 1 :(得分:0)

您可以重新查询:

select sum(ic.cnt * coalesce(nb.cnt, 1))
from (select line_no, bus_no, count(*) as cnt 
      from ic_card_trade ic
      group by line_no, bus_no
     ) ic left join
     (select line_no, bus_no, count(*) as cnt
      from netpack_busstop nb
      group by line_no, bus_no
     ) nb
     on ic.line_no = nb.line_no and
        ic.bus_no = nb.bus_no;

也就是说,先进行汇总 ,然后计算生成的行数。