Я бы хотел применить функции сводной и настраиваемой статистики ко всем столбцам независимо и параллельно .
from pyspark.sql.functions import rand, randn
df = sqlContext.range(0, 10).withColumn('uniform', rand(seed=10)).withColumn('normal', randn(seed=27))
Я пытался найти ответы, такие как здесь и здесь , но они, кажется, дают одно значение для каждой строки. Кажется, что udf
и withColumns
являются решениями, но я не уверен, как собрать вместе, чтобы достичь чего-то похожего на это:
df.describe().show()
+-------+------------------+-------------------+--------------------+
|summary| id| uniform| normal|
+-------+------------------+-------------------+--------------------+
| count| 10| 10| 10|
| mean| 4.5| 0.5215336029384192|-0.01309370117407197|
| stddev|2.8722813232690143| 0.229328162820653| 0.5756058014772729|
| min| 0|0.19657711634539565| -0.7195024130068081|
| max| 9| 0.9970412477032209| 1.0900096472044518|
+-------+------------------+-------------------+--------------------+
Допустим, у нас есть пара фиктивных функций для сводки
def mySummary1(df_1_col_only):
return mean(df_1_col_only)*second_largest(df_1_col_only)
def mySummary2(df_1_col_only):
return 10th_decile(df_1_col_only)/median(df_1_col_only)
чтобы при применении параллельно ко всем столбцам
df.something_that_allow_spark_parallel_processing_all_columns(column_list, [mean, mySummary1, mySummary2])
и производим (предпочтительно следующие или транспонированные)
+-------+------------------+-------------------+--------------------+
|col_name| mean| mySummary1| mySummary2|
+-------+------------------+-------------------+--------------------+
| id| 10| 10| 10|
|uniform| 4.5| 0.5215336029384192|-0.01309370117407197|
| normal|2.8722813232690143| 0.229328162820653| 0.5756058014772729|
+-------+------------------+-------------------+--------------------+
Я бы хотел использовать параллельную мощь Spark для распараллеливания в обоих столбцах списка и внутри каждой mySummaryxxx функций.
Другой вопрос: каким должен быть мой df_1_col_only для эффективности? Фрейм данных Spark с 1 столбцом? Есть ли способ не копировать дубликаты исходного кадра данных в набор из одного столбца данных?