Как отфильтровать входные значения для процентиля, используя SparkSQL? - PullRequest
0 голосов
/ 11 июля 2019

У меня такая ситуация:

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|
+-----------------------------------------+----------------------------------------+

Есть ли способ отфильтровать значения для price и size на основании какого-либо условия? Например, скажем, я хочу включить только значения> 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?

1 Ответ

0 голосов
/ 12 июля 2019

Я сам нашел решение:

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|
+------------+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...