按键显示不同值的spark/hive udaf

3phpmpom  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(343)

在大数据处理中,通常需要在不改变现有查询结构(分组、子查询等)的情况下“勾画”组的摘要。在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的库,但是没有找到一个函数可以实现这一点。

jum4pzuy

jum4pzuy1#

西姆,我想像这样的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 可能更有效,更容易使用。

相关问题