我正在使用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 子句中的子查询执行一次,结果被缓存,或者 CBO 将基本上只有一行的整个 temp_tab 表运送到所有节点,但它似乎不像将字符串值作为文字输入那样好!
是否可以显式声明需要在 hive 中缓存表?我可以明确声明查询只需要执行一次并缓存结果吗?我在这里错过了什么?
我知道字符串中的列不是最好的情况,但我无能为力。
任何帮助将不胜感激!
您可以将交叉映射连接与单行子查询一起使用,然后按不相等条件过滤行:
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