Spark 1.6: фильтрация фреймов данных, сгенерированных методом описать()

Проблема возникает, когда я вызываю функцию describe в DataFrame:

val statsDF = myDataFrame.describe()

Вызов функции описания дает следующий результат:

statsDF: org.apache.spark.sql.DataFrame = [summary: string, count: string]

Я могу нормально показать statsDF, позвонив statsDF.show()

+-------+------------------+
|summary|             count|
+-------+------------------+
|  count|             53173|
|   mean|104.76128862392568|
| stddev|3577.8184333911513|
|    min|                 1|
|    max|            558407|
+-------+------------------+

Теперь я хотел бы получить стандартное отклонение и среднее значение от statsDF, но когда я пытаюсь собрать значения, выполнив что-то вроде:

val temp = statsDF.where($"summary" === "stddev").collect()

Я получаю исключение Task not serializable.

Я также сталкиваюсь с тем же исключением, когда звоню:

statsDF.where($"summary" === "stddev").show()

Похоже, мы не можем фильтровать кадры данных, сгенерированные функцией describe()?


person Rami    schedule 08.02.2016    source источник
comment
Я голосую за это. Теперь странно иметь возможность фильтровать DF, созданный с помощью описания   -  person eliasah    schedule 08.02.2016


Ответы (4)


Я рассмотрел игрушечный набор данных, который у меня был, содержащий некоторые данные о заболеваниях

val stddev_tobacco = rawData.describe().rdd.map{ 
    case r : Row => (r.getAs[String]("summary"),r.get(1))
}.filter(_._1 == "stddev").map(_._2).collect
person eliasah    schedule 08.02.2016
comment
@Rami Это должно сработать, подумал, что это немного глупо и наивно ... Скажи мне, работает ли это для тебя! - person eliasah; 08.02.2016
comment
Спасибо @eliasah, странно, что мы не можем фильтровать тезисы DF. Я подумаю, может быть, указать на эту проблему ребятам из Spark. - person Rami; 08.02.2016
comment
@zero323, что вы думаете по этому поводу? Должны ли мы открыть вопрос об этом в JIRA? - person eliasah; 08.02.2016
comment
@ Рами, это действительно странно для меня! Вот почему я спрашиваю об этом большого шеф-повара :) - person eliasah; 08.02.2016
comment
Большой повар великолепен ;) - person Rami; 08.02.2016
comment
Это полезно. Можете ли вы предложить, какая модификация требуется, чтобы это работало для всей строки (когда у меня есть несколько числовых столбцов в исходном наборе данных) - person Omley; 17.06.2016

Вы можете выбрать из кадра данных:

from pyspark.sql.functions import mean, min, max
df.select([mean('uniform'), min('uniform'), max('uniform')]).show()
+------------------+-------------------+------------------+
|      AVG(uniform)|       MIN(uniform)|      MAX(uniform)|
+------------------+-------------------+------------------+
|0.5215336029384192|0.19657711634539565|0.9970412477032209|
+------------------+-------------------+------------------+

Вы также можете зарегистрировать его как таблицу и запросить таблицу:

val t = x.describe()
t.registerTempTable("dt")

%sql 
select * from dt
person oluies    schedule 02.03.2016

Другой вариант - использовать selectExpr(), который также оптимизирован, например. чтобы получить мин:

myDataFrame.selectExpr('MIN(count)').head()[0]
person Boern    schedule 24.08.2016

myDataFrame.describe().filter($"summary"==="stddev").show()

Это отлично работало на Spark 2.3.0.

person kvk    schedule 16.12.2018
comment
Работал и на Spark 2.1.0. - person Nitin; 16.04.2019