在 Hive 中选择一个随机行作为聚合函数

Choose a random row as aggregate function in Hive

提问人:Leo Jiang 提问时间:6/29/2017 最后编辑:Leo Jiang 更新时间:8/27/2021 访问量:6148

问:

我想按一列分组,然后从另一列中选择随机行。在 Presto 中,有 .arbitrary

例如,我的查询是:

SELECT a, arbitrary(b)
FROM foo
GROUP BY a

如何在 Hive 中执行此操作?

编辑:

我所说的“随机”是指“任意”。它可能每次都只是第一排。

SQL 配置单元

评论

0赞 Leo Jiang 6/29/2017
@DuduMarkovitz我不需要特定的,其中任何一个都可以。ba
0赞 Leo Jiang 6/29/2017
一点是,如果都是一样的。还有一点是,如果很多人都有相同的,我不在乎我得到哪个。F.D.(英语:F.D.) 散列更改为 。bbabba
0赞 David דודו Markovitz 6/29/2017
请添加数据示例。
4赞 Ward W 10/17/2017
就原始海报而言,我认为这个想法是避免确定最大值或最小值的计算负担,而是使用“任意”作为 GROUP BY 的一部分,以避免重复(当它们存在时),但当用户不关心选择哪个值时。例如,也许我想按人聚合并获取每个社会安全号码(唯一)的一行,但我也想在结果中获取他们的名字,但有时他们的名字被列为“Stephen”,有时被列为“Steven”,但我不在乎是哪一个,并希望我的查询通过避免 MAX/MIN 来运行得更快。
0赞 Asclepius 8/3/2021
arbitrary可以在特定环境中使用,在这些环境中,其使用可以确定性,或者在处理大数据时不可避免地需要。它不应在产生随机输出的默认设置中使用。再现性是一个重要的特性。

答:

0赞 scarlett_r 8/27/2021 #1

可以使用以下逻辑在 Hive 中获取所需的结果。 向 rand(b) 提供row_number,然后选择所需的任何row_number。每次它都会从 b 列返回一个随机值。

select a, b
from (
select a, b,row_number() over( partition by a order by rand(b) asc) rn from foo
)a
where rn=1
group by a, b;