Спарктиль вычисляет процентиль в ячейке, содержащей список двойников
У меня есть 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