我有 10K 列和 7000 万行的 DF。我想计算 10K 列的均值和 corr。我做了下面的代码,但由于代码大小 64K 问题( https://issues.apache.org/jira/browse/SPARK-16845 ),它不起作用

数据:

region dept week sal val1  val2  val3 ... val10000
 US    CS   1     1    2    1     1   ...  2
 US    CS   2     1.5  2    3     1   ...  2
 US    CS   3     1    2    2     2.1      2
 US    ELE  1     1.1  2    2     2.1      2
 US    ELE  2     2.1  2    2     2.1      2
 US    ELE  3     1    2    1     2   .... 2
 UE    CS   1     2    2    1     2   .... 2

代码:
aggList =  [func.mean(col) for col in df.columns]  #exclude keys
df2= df.groupBy('region', 'dept').agg(*aggList)

代码 2
aggList =  [func.corr('sal', col).alias(col) for col in df.columns]  #exclude keys
df2  = df.groupBy('region', 'dept', 'week').agg(*aggList)

这失败了。有没有其他方法可以克服这个错误?有没有人用 10K 列尝试过 DF?对性能改进有什么建议吗?

最佳答案

我们也遇到了 64KB 的问题,但是在 where 子句中,这是在另一个错误报告下提交的。我们用作解决方法的方法很简单,分几个步骤进行操作/转换。

在您的情况下,这意味着您不会一步完成所有聚合。而是在外部操作中循环相关列:

  • 使用 select 创建一个临时数据框,它只包含操作所需的列。
  • 像您一样使用 groupByagg ,除了不是聚合列表,而是仅用于(或两个,您可以组合 meancorr
  • 收到对所有临时数据帧的引用后,使用 withColumn 将临时数据帧中的聚合列附加到结果 df。

  • 由于 Spark DAG 的惰性求值,这当然比一次操作要慢。但它应该在一次运行中评估整个分析。

    关于python - 在 pyspark Dataframe 中查找 10,000 列的均值和 corr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40044779/

    10-10 11:21