Spark / Hive UDAF按键显示不同的值

时间:2016-12-30 07:21:19

标签: apache-spark hive apache-spark-sql aggregate-functions hiveql

在大数据处理中,通常需要“草绘”组的摘要,而不用更改现有的查询结构(分组,子查询等)。在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和其他一些库,但是没有找到执行此功能的函数。

1 个答案:

答案 0 :(得分:1)

Sim,我认为像我这样的UDAF存在于我的砖库中,称为gatherhttps://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可能更有效,并且更容易使用。