如何在PySpark数据框中汇总许多列

时间:2018-06-24 04:45:32

标签: apache-spark pyspark

我有一个带有int值的数据框,我想分别对每一列求和,然后测试该列的总和是否大于5。如果该列的总和大于5,那么我想将其添加到feature_cols中。我在网上找到的答案仅适用于熊猫,不适用于PySpark。 (我正在使用Databricks)

这是我到目前为止所拥有的:

working_cols = df.columns

for x in range(0, len(working_cols)): 
    if df.agg(sum(working_cols[x])) > 5:
        feature_cols.append(working_cols[x])

此操作的当前输出是feature_cols具有每一列,即使有些总和小于5。

Out[166]: 
['Column_1',
 'Column_2',
 'Column_3',
 'Column_4',
 'Column_5',
 'Column_6',
 'Column_7',
 'Column_8',
 'Column_9',
 'Column_10']

1 个答案:

答案 0 :(得分:1)

我不是python专家,但是在您的循环中,您正在将DataFrame[sum(a): bigint]与5进行比较,由于某种原因,答案为True。

df.agg(sum(working_cols[x])).collect()[0][0]应该给您您想要的东西。实际上,我将数据帧收集到驱动程序,选择第一行(只有一个),然后选择第一列(也只有一个)。

请注意,就性能而言,您的方法并非最佳。您可以只通过一次数据帧计算所有总和,如下所示:

sums = [F.sum(x).alias(str(x)) for x in df.columns]
d = df.select(sums).collect()[0].asDict()

使用此代码,您将获得一个字典,该字典将每个列名与其总和相关联,并且您可以在该字典上应用任何对您而言有意义的逻辑。