在pyspark Dataframe

时间:2016-10-14 13:45:59

标签: python apache-spark pyspark spark-dataframe

我有10K列和70万行的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?对绩效改进有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

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

  • 使用select创建临时数据框,其中只包含操作所需的列。
  • 像您一样使用groupByagg,但不是聚合列表,只是on(或两个,您可以合并mean和{{1} }。
  • 收到对所有临时数据框的引用后,使用withColumn将临时数据框中的聚合列附加到结果df。

由于对Spark DAG的惰性评估,当然在一次操作中这样做会慢一些。但它应该在一次运行中评估整个分析。