在大数据处理中,通常需要“草绘”组的摘要,而不用更改现有的查询结构(分组,子查询等)。在Spark SQL(和HiveQL)中,date user_id category revenue
1/1 1 a 1
1/1 2 b 0
1/1 3 a 0
1/2 2 b 10
1/2 3 a 0
1/2 4 b 1
是执行此操作的UDAF的示例。它为每个组构建一个列的唯一值数组。
我正在寻找一个UDAF,它为B列的每个唯一值构建A列唯一值的映射。例如,给定
select date, collect_set_by_key(category, user_id) as distinct_user_ids_by_category
from tbl
group by date
order by date
查询
date distinct_user_ids_by_category
1/1 {a: [1, 3], b: [2]}
1/2 {a: [3], b: [2, 4]}
应生成
build.xml:194: Fatal error during transformation
at org.apache.tools.ant.taskdefs.XSLTProcess.handleTransformationError(XSLTProcess.java:1273)
Collect to a Map in Hive要求相同的结果,但不要求解决方案通过单个UDAF而不更改查询结构,这使得这个问题大不相同。
我的部署环境是Spark 2.1,因此Hive UDAF或本机Spark UDAF同样可以正常工作。我已经使用Hive UDAF检查了brickhouse,hivemall和其他一些库,但是没有找到执行此功能的函数。
答案 0 :(得分:1)
Sim,我认为像我这样的UDAF存在于我的砖库中,称为gather
(https://github.com/jeromebanks/brickhouse/blob/master/src/main/java/brickhouse/udf/collect/GatherUDAF.java)但不在klout版本中。我很难回归到klout回购网站。如果看到多个记录,我认为列表可以包含重复项。
SELECT date, gather( category, user_id )
FROM tbl
GROUP BY date;
这也可以通过多个收集来完成,如其他问题的链接中所述,但我认为gather
可能更有效,并且更容易使用。