如何使用 SparkSQL 过滤百分位数的输入值?

Posted

技术标签:

【中文标题】如何使用 SparkSQL 过滤百分位数的输入值?【英文标题】:How to filter input values for percentile using SparkSQL? 【发布时间】:2019-07-11 19:57:53 【问题描述】:

我有这样的情况:

scala> val values = Seq((7,-1),(null,null),(1,0),(null,3),(2,5),(-1,null)).toDF("price","size")

scala> values.createOrReplaceTempView("mydata")

scala> sqlContext.sql("select percentile(price,0.5), percentile(size,0.5) from mydata").show()
+-----------------------------------------+----------------------------------------+
|percentile(price, CAST(0.5 AS DOUBLE), 1)|percentile(size, CAST(0.5 AS DOUBLE), 1)|
+-----------------------------------------+----------------------------------------+
|                                      1.5|                                     1.5|
+-----------------------------------------+----------------------------------------+

有没有办法根据某些条件过滤pricesize 的值?例如,假设我只想包含 > 0 的值。在 Postgres 中,我可以执行以下操作:

select
   percentile_cont (0.5) within group (order by price) filter (where price > 0),
   percentile_cont (0.5) within group (order by size) filter (where size > 0)
from (values (7,-1),(null,null),(1,0),(null,3),(2,5),(-1,null)) T(price,size);

 percentile_cont | percentile_cont
-----------------+-----------------
               2 |               4

SparkSQL 有什么类似的吗?

【问题讨论】:

您可以在数据框中过滤为values.filter($"size" gt 0).createOrReplaceTempView("mydata") 这就像在查询中放一个where,它会影响两个参数(pricesize)但仅在一个条件下(size 【参考方案1】:

我自己找到了解决办法:

sqlContext.sql("select percentile(case when price > 0 then price else null end,0.5) as median_price, percentile(case when size > 0 then size else null end, 0.5) as median_size from mydata").show()
+------------+-----------+
|median_price|median_size|
+------------+-----------+
|         2.0|        4.0|
+------------+-----------+

【讨论】:

以上是关于如何使用 SparkSQL 过滤百分位数的输入值?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据百分位数过滤表格,然后在 HQL 中随机抽样?

查找名为 mag(地震震级)的列的百分位数

如何在 numpy / scipy 中获取特定百分位数的索引?

值计数的百分位数

使用matplotlib绘制百分位数

如何在 JavaScript(或 PHP)中获取数组的中位数和四分位数/百分位数?