为啥我无法在 Hive 中使用具有多个插入子句的高级聚合功能?

Posted

技术标签:

【中文标题】为啥我无法在 Hive 中使用具有多个插入子句的高级聚合功能?【英文标题】:Why am I unable to use advanced aggregation features with a multiple insert clause in Hive?为什么我无法在 Hive 中使用具有多个插入子句的高级聚合功能? 【发布时间】:2017-01-05 07:35:22 【问题描述】:

我想使用具有高级聚合功能with cube 的多重插入子句将多个聚合值插入 Hive 中的单个表中。 但是,由于未知原因,未插入列集的小计。

当使用列值的默认值 null 以及使用 coalesce 将其替换为字符串时,都会出现此问题。 在任何列中都没有可能导致冲突的空值。 其他高级聚合功能(grouping setsrollup)也会出现此问题。 我希望使用这种插入方法,因为它是执行此操作的最有效方式。

我使用的语法是:

FROM tablename1
INSERT OVERWRITE TABLE tablename2 PARTITION (partcol1=val1) SELECT select_statement1 WHERE where_condition1 GROUP BY col_list WITH CUBE
INSERT OVERWRITE TABLE tablename2 PARTITION (partcol1=val2) SELECT select_statement2 WHERE where_condition2 GROUP BY col_list WITH CUBE ...;

有没有办法解决这个问题,或者这种方式不能使用多重插入子句?

提前感谢您的帮助。

【问题讨论】:

James 你为什么不用动态分区..? 在这种情况下,不使用动态分区有两个原因。 1. 该表包含两个分区,其中一个是在每个插入子句的 where 条件中定义的,因此必须手动设置该值。 2.批量查询的执行环境要求使用静态分区。 【参考方案1】:

此问题似乎特定于 Map-reduce 执行引擎。上面的语法在执行引擎换成Tez后正常执行。

https://issues.apache.org/jira/browse/HIVE-15581

【讨论】:

以上是关于为啥我无法在 Hive 中使用具有多个插入子句的高级聚合功能?的主要内容,如果未能解决你的问题,请参考以下文章

进入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型

进入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型

为啥在具有多个连接的 WHERE 子句中,子查询比文字值执行得更好?

Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中

Hive:如何比较 WHERE 子句中具有复杂数据类型的两列?

何时在 hive QL 中使用 sort By 子句