Спарктиль вычисляет процентиль в ячейке, содержащей список двойников

У меня есть DataFrame, который имеет столбец ячеек, содержащий список двойников. Вот пример:

 с1 с2 с3
-------------------------------------------

 аа [0,0,1,0, 6,0,3,3 ...]

 a       b       [1.0, 2.0, 3.4, ... ]

 аа с [1,0, 2,2, 3,5, ... ]

 ...

Этот DataFrame был сгенерирован чтением в нескольких файлах CSV, которые затем были переданы через collect_list так же как sort_array, Например:

val df = orig.groupBy ("c1","c2").agg( sort_array(collect_list("c3")).as("c3") )

Для каждой ячейки в столбце 3 (с3) я хотел бы вычислить процентиль для каждой ячейки. Результирующий DataFrame будет содержать только одно значение в c3.

Буду признателен за любые указания на этот вопрос.

1 ответ

Следующие, кажется, сделали свое дело. Обратите внимание, что правильность функции здесь не имеет отношения к делу, а скорее к тому, как она была вызвана:

def computePercentile(data: WrappedArray [Double], tile: Int): Double ={ ... }


val test = orig.select("c3").rdd.map { case Row { val:WrappedArray[Double]) => (val,computePercentile (val,95))}.toDF("c1percent")

Вторым подходом был вариант с использованием UDF.

val percentUDF = org.apache.spark.sql.functions.udf((val: WrappedArray[Double]) => {computePercentile(simval,95)})
...

val result = orig.groupBy ("c1","c2").agg(percentUDF(sort_array(collect_list("c3"))).as("c3"))

Полученная таблица - это то, что я хотел:

c1      c2      c3
------------------------------

 a       a       0.111

 a       b       0.222

 aa      c       1.123
Другие вопросы по тегам