【问题标题】:Optimizing Hive subquery queries优化 Hive 子查询查询
【发布时间】:2018-04-20 23:08:56
【问题描述】:

我正在使用 HDP 2.6.2 和 hive。

我有一种情况,我正在根据一个列从一个大表中更新一个分区表,而查询却表现不佳,我不明白为什么。下面的插入语句就是一个例子

insert into partitioned_table partition(dt_month) select * from large_table where incremental_string_col > (select last_incremental_col from temp_tab)

这里我假设,where 子句中的子查询被执行一次,结果被缓存,或者整个 temp_tab 表(基本上只有一行)被 CBO 运送到所有节点,但它似乎并不像将字符串值作为文字放入!

我可以明确声明需要在 hive 中缓存表吗? 我可以明确声明一个查询只需要执行一次并缓存结果吗? 我在这里错过了什么?

我理解 where 中的列不是最好的情况,但我无能为力。

任何帮助将不胜感激!

【问题讨论】:

  • 我也不能使用 mapjoin,因为我记得不支持 hive 连接中的不等式。

标签: optimization hive cbo


【解决方案1】:

您可以使用交叉 ma​​p 连接单行子查询,然后按不等式条件过滤行:

select * 
  from large_table l
       cross join (single_row_subquery) s
 where l.incremental_string_col>s.last_incremental_col;

或者在单独的脚本中计算子查询并作为 hivevar 变量传递,如下所示:https://stackoverflow.com/a/37821218/2700344

【讨论】:

  • 单行子查询的映射连接也表现不佳。我想我不得不遗憾地选择另一种选择。但是有没有更优雅的方式来做到这一点?也许在同一个蜂巢会话中?
  • 如果 mapjoin 工作,它的性能应该与没有加入几乎相同
  • 如何确保 mapjoin 正常工作?有什么方法可以让我查看应用了哪些优化?我也尝试在选择上明确说明这一点作为提示,但性能很差。
  • @SubramaniamRamasubramanian 研究计划,执行explain select... 见:stackoverflow.com/a/42972030/2700344。检查负责 mapjoin 的配置:community.hortonworks.com/content/supportkb/49639/…
猜你喜欢
  • 2016-03-29
  • 2020-07-24
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多