为何该Hive查询中lateral view explode需搭配group by?
为什么必须添加
GROUP BY id? 下面这条Hive SQL可以正常执行:
with sartab as ( select 1 id, split(concat_ws(',',map_keys(map('a',0.1,'b',0.2,'c',0.15)), array('id_queue', 'queue_disposition')),',') sar_keys, split(concat_ws(',',map_values(map('a','0.1','b','0.2','c','0.15')), array(CAST(1234 AS string), 'queue_disposition_val')),',') sar_vals ) select id, str_to_map(concat_ws(',',collect_set(concat(c1.ckey,':',sar_vals[c1.i] )))) as map_col from sartab t lateral view posexplode(sar_keys) c1 as i,ckey group by id;
执行后得到结果:
1 {"a":"0.1","b":"0.2","c":"0.15","id_queue":"1992","queue_disposition":"queue_disposition_val"} Time taken: 2.908 seconds, Fetched: 1 row(s)
但如果移除语句中的GROUP BY id,会抛出如下语义异常:
FAILED: SemanticException [Error 10025]: Line 6:8 Expression not in GROUP BY key 'id'
原因解释
collect_set是聚合函数,作用是对多行数据做汇总计算,生成单一的集合结果。- Hive遵循ANSI SQL的语法规则:当SELECT语句里包含聚合函数时,所有未被聚合的列(比如这里的
id)必须出现在GROUP BY子句中,用来明确聚合的分组依据。 - 你的查询里,
posexplode会把sar_keys数组拆成多行(每个数组元素对应一行),如果不加GROUP BY id,Hive无法确定:id列要和聚合后的collect_set结果如何关联?毕竟聚合函数是对组内数据计算,没有分组的话,Hive不知道哪些行属于同一组,同时非聚合列id也没有明确的分组归属,因此触发语义错误。 - 加上
GROUP BY id后,Hive会把所有id相同的行(这里是原始id=1的行拆出来的多行)归为一组,对每组执行collect_set聚合,而id作为分组键,自然可以合法出现在SELECT列表中。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

