Pyspark применяет функцию параллельной сводки ко всем столбцам - PullRequest
1 голос
/ 21 марта 2019

Я бы хотел применить функции сводной и настраиваемой статистики ко всем столбцам независимо и параллельно .

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 столбцом? Есть ли способ не копировать дубликаты исходного кадра данных в набор из одного столбца данных?

...