Pyspark将并行汇总功能应用于所有列

时间:2019-03-20 21:26:48

标签: python apache-spark pyspark apache-spark-sql

我想将摘要和自定义统计功能应用于所有列,分别独立地和并行

from pyspark.sql.functions import rand, randn
df = sqlContext.range(0, 10).withColumn('uniform', rand(seed=10)).withColumn('normal', randn(seed=27))

我试图寻找诸如herehere之类的答案,但是它们似乎为每一行给出了一个值。似乎udfwithColumns是解决方案,但我不确定如何将它们组合在一起以实现类似于以下目的:

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应该如何提高效率? 1列Spark数据框是否有一种不复制的方法,将原始数据帧复制到一列1列数据帧中?

0 个答案:

没有答案