如何在Impala中实现行转列?Hive方法无法生效
刚好之前在Impala里处理过类似的行转列需求,Hive那套collect_list+Map的玩法确实在Impala里不太行,不过有两种实用的方案能解决你的问题,看你的场景选就行:
方法1:用CASE WHEN(适合已知目标列的固定场景)
因为你的例子里目标列只有x_user和y_user,这种固定列的情况用CASE WHEN是最稳妥的,而且兼容所有Impala版本,不需要依赖特殊函数:
SELECT day AS Day, MAX(CASE WHEN name = 'x_user' THEN jobdone ELSE NULL END) AS x_user, MAX(CASE WHEN name = 'y_user' THEN jobdone ELSE NULL END) AS y_user FROM test GROUP BY day ORDER BY day;
简单解释下逻辑:先按day分组,然后用CASE WHEN匹配每个用户对应的jobdone值,最后用MAX(或者MIN,因为每个日期每个用户只有一条数据)把非空值提取出来,就能把行数据转成你要的列格式了。
方法2:用Impala PIVOT函数(适合动态列场景,Impala 3.0+支持)
如果你的用户列表以后可能新增,或者不想硬编码列名,Impala 3.0及以上版本支持标准SQL的PIVOT语法,写起来更简洁:
SELECT * FROM test PIVOT ( MAX(jobdone) -- 因为每个分组每个用户只有一条数据,MAX/AVG/SUM都可以 FOR name IN ('x_user' AS x_user, 'y_user' AS y_user) ) AS pivot_result ORDER BY day;
这里PIVOT子句里指定聚合函数和要转成列的字段,IN后面列出要生成的列名对应关系,执行后就能直接得到你想要的宽表结构。
需要注意的是,Impala对Hive的一些自定义UDF支持有限,所以之前Hive能用的collect_list+Map组合在Impala里要么不生效,要么性能很差,上面两种方法是更适合Impala的原生解决方案。
内容的提问来源于stack exchange,提问作者3468311
相关产品推荐
相关产品推荐

