我有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?对绩效改进有什么建议吗?
答案 0 :(得分:1)
我们也遇到了64KB问题,但是在where子句中,它是在另一个错误报告下提交的。我们用作解决方法的方法很简单,就是在几个步骤中进行操作/转换。
在您的情况下,这意味着,您不能一步完成所有聚合操作。而是循环外部操作中的相关列:
select
创建临时数据框,其中只包含操作所需的列。groupBy
和agg
,但不是聚合列表,只是on(或两个,您可以合并mean
和{{1} }。withColumn
将临时数据框中的聚合列附加到结果df。 由于对Spark DAG的惰性评估,当然在一次操作中这样做会慢一些。但它应该在一次运行中评估整个分析。