在大数据处理中,通常需要"草图"组的不更改现有查询结构(分组,子查询等)。在Spark SQL(和HiveQL)中,collect_set
是执行此操作的UDAF的示例。它构建了每组列的唯一值的数组。
我正在寻找一个UDAF,该UDAF构建了B列A列的唯一值的映射。
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
查询
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]}
在Hive中收集到地图要求相同的结果,但不需要通过单个UDAF进行解决方案,而无需更改查询结构,这使该问题大为不同。
我的部署环境是Spark 2.1,因此Hive UDAF或本地Spark UDAF的工作方式同样可以。我已经检查了Brickhouse,HiveMall和其他一些带有Hive Udafs的库,但尚未找到可以执行此操作的函数。
sim,我认为像这样的udaf存在于我的砖砌叉子中,称为 gather
(https://github.com/jeromebanks/jeromebanks/brickhouse/brickhouse/blob/master/master/src/src/main/main/java/brickhouse/udf/collect/gatherudaf.java),但不在klout版本中。我回到Klout Repo并不是很好。我认为列表可以包含重复项,如果看到了多个记录。
SELECT date, gather( category, user_id )
FROM tbl
GROUP BY date;
这也可以用多个收藏来完成,如另一个问题的链接中所述,但我认为gather
可能更有效,并且更易于使用。