在大数据处理中,通常需要在不改变现有查询结构(分组、子查询等)的情况下“勾画”组的摘要。在spark sql(和hiveql)中 collect_set
是一个udaf的例子。它为每个组构建一个列的唯一值数组。
我正在寻找一个udaf,它为列b的每个惟一值构建一个来自列a的惟一值的Map。例如,给定
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]}
“收集到配置单元中的Map”要求相同的结果,但不要求通过单个udaf实现解决方案,而不需要更改查询结构,这使得这个问题有很大的不同。
我的部署环境是spark2.1,因此配置单元udaf或本机sparkudaf也同样适用。我已经检查过brickhouse、hivemall和其他几个带有hiveudafs的库,但是没有找到一个函数可以实现这一点。
1条答案
按热度按时间jum4pzuy1#
西姆,我想像这样的udaf存在于我的砖房叉子里,叫做
gather
( https://github.com/jeromebanks/brickhouse/blob/master/src/main/java/brickhouse/udf/collect/gatherudaf.java )但不是在klout版本中。我不太擅长合并回klout回购。我认为如果看到多个记录,列表可能包含重复项。这也可以通过多个收集来完成,正如在另一个问题的链接中提到的,但是我认为
gather
可能更有效,更容易使用。