当percentile_approx基于groupby返回特定列的单个值时,如何选择另一列的对应值?

Posted

技术标签:

【中文标题】当percentile_approx基于groupby返回特定列的单个值时,如何选择另一列的对应值?【英文标题】:How to select the corresponding value of another column when percentile_approx returns a single value of a particular column based on groupby? 【发布时间】:2018-10-18 14:11:44 【问题描述】:

我是 pyspark 的新手,需要一点说明。 我有一个类似这样的 PySpark 表:

+---+-------+-----+-------+
| id| ranges|score|    uom|
+---+-------+-----+-------+
|  1|    low|   20|percent|
|  1|verylow|   10|percent|
|  1|   high|   70|  bytes|
|  1| medium|   40|percent|
|  1|   high|   60|percent|
|  1|verylow|   10|percent|
|  1|   high|   70|percent|
+---+-------+-----+-------+

我想计算给定百分比为 0.95 的分数列的百分位值,同时我希望它也应该返回相应的范围值。我尝试运行此查询:

results = spark.sql('select percentile_approx(score,0.95) as score, first(ranges)  from subset GROUP BY id')

我得到这样的结果:

+-----+--------------------+
|score|first(ranges, false)|
+-----+--------------------+
|   70|                 low|
+-----+--------------------+

它返回不正确的范围的第一个值,它应该是“高”。 如果我从查询中删除 first(ranges) 它会给我错误:

> pyspark.sql.utils.AnalysisException: u"expression 'subset.`ranges`' is
> neither present in the group by, nor is it an aggregate function. Add
> to group by or wrap in first() (or first_value) if you don't care
> which value you get.;;\nAggregate [id#0L],
> [percentile_approx(score#2L, cast(0.95 as double), 10000, 0, 0) AS
> score#353L, ranges#1]\n+- SubqueryAlias subset\n   +- LogicalRDD
> [id#0L, ranges#1, score#2L, uom#3], false\n

【问题讨论】:

您需要使用Window 函数 - 查看this example。 【参考方案1】:

这是因为您仅按 id 分组。因此,通过使用第一个函数,您实际上是从范围列中选择了一个随机值。

一种解决方案是创建第二个数据框,其中包含分数到范围的映射,然后在最后将其连接回结果 df。

>>> df.registerTempTable("df") # Register first before selecting from 'df'
>>> map = spark.sql('select ranges, score from df')

>>> results = spark.sql('select percentile_approx(score,0.95) as score from subset GROUP BY id')

>>> results .registerTempTable("results ") 
>>> final_result = spark.sql('select r.score, m.ranges from results as r join map as m on r.score = m.score')

【讨论】:

以上是关于当percentile_approx基于groupby返回特定列的单个值时,如何选择另一列的对应值?的主要内容,如果未能解决你的问题,请参考以下文章

hive计算分位数

如何从 percentile_approx 代码编写自定义函数,该函数在 excel 中给出与 percentile.inc 相同的结果?

hive 分位数函数 percentile(col, p)

基于案例分析 MySQL Group Replication 的故障检测流程

mysql 5.7 Group Replication

Galera将死——MySQL Group Replication正式发布