【问题标题】:How to Improve Cross Join Performance in Hive TEZ?如何提高 Hive TEZ 中的交叉连接性能?
【发布时间】:2021-01-11 17:49:10
【问题描述】:

我有一个包含 50 亿条记录的配置单元表。我希望将这 50 亿条记录中的每一条与硬编码的 52 条记录连接起来。

为了实现这一点,我正在做一个交叉连接

select * 
from table1 join table 2
ON 1 = 1;

这需要 5 个小时才能以尽可能高的内存参数运行。

还有其他更短或更简单的方法可以在更短的时间内实现这一目标吗?

【问题讨论】:

    标签: performance hive hiveql cross-join apache-tez


    【解决方案1】:

    开启地图连接:

    set hive.auto.convert.join=true;
    
    select * 
     from table1 cross join table2;
    

    该表很小(52 条记录),应该适合内存。 map-join operator 会将小表加载到分布式缓存中,每个 reducer 容器将使用它来处理内存中的数据,比 common-join 快得多。

    【讨论】:

      【解决方案2】:

      您的查询速度很慢,因为交叉连接(笛卡尔积)由一个单一的减速器处理。解决方法是强制执行更高的并行性。一种方法是将查询变成内连接,从而利用 map-side join 优化。

      with t1 as (
        selct col1, col2,..., 0 as k from table1
      )
      ,t2 as (
        selct col3, col4,..., 0 as k from table2 
      )
      selct 
        *
      from t1 join t2 
          on t1.k = t2.k 
      

      现在每个表 (CTE) 都有一个名为 k 的假列,其值相同为 0。所以它的工作原理就像交叉连接,而只发生地图侧连接操作。

      【讨论】:

      • 我试过了,但是仍然有一个减速器运行了很长时间(显然是 1 = 1 的那个)。
      猜你喜欢
      • 2011-07-20
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多