我想将摘要和自定义统计功能应用于所有列,分别独立地和并行。
from pyspark.sql.functions import rand, randn
df = sqlContext.range(0, 10).withColumn('uniform', rand(seed=10)).withColumn('normal', randn(seed=27))
我试图寻找诸如here和here之类的答案,但是它们似乎为每一行给出了一个值。似乎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应该如何提高效率? 1列Spark数据框是否有一种不复制的方法,将原始数据帧复制到一列1列数据帧中?