SPARK/HIVE UDAF可通过键使用不同的值



在大数据处理中,通常需要"草图"组的不更改现有查询结构(分组,子查询等)。在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可能更有效,并且更易于使用。

相关内容

  • 没有找到相关文章

最新更新