pyspark数据帧总和

时间:2018-05-13 05:10:29

标签: dataframe pyspark pyspark-sql

我正在尝试在pyspark.sql.dataframe

上执行以下操作
from pyspark.sql.functions import sum as spark_sum
df = spark.createDataFrame([
    ('a', 1.0, 1.0), ('a',1.0, 0.2), ('b', 1.0, 1.0),
    ('c' ,1.0, 0.5), ('d', 0.55, 1.0),('e', 1.0, 1.0)
])
>>> df.show()
+---+----+---+                                                                  
| _1|  _2| _3|
+---+----+---+
|  a| 1.0|1.0|
|  a| 1.0|0.2|
|  b| 1.0|1.0|
|  c| 1.0|0.5|
|  d|0.55|1.0|
|  e| 1.0|1.0|
+---+----+---+

然后,我正在尝试执行以下操作。

1)选择列df[_2]>列时的行df[_3]

2)对于从上面选择的每一行,乘以df[_2] * df[_3],然后取其总和

3)将上面的结果除以df[_3]

列的总和

这是我做的:

>>> filter_df = df.where(df['_2'] > df['_3'])
>>> filter_df.show()
+---+---+---+
| _1| _2| _3|
+---+---+---+
|  a|1.0|0.2|
|  c|1.0|0.5|
+---+---+---+

>>> result = spark_sum(filter_df['_2'] * filter_df['_3']) 
             / spark_sum(filter_df['_3'])

>>> df.select(result).show()
+--------------------------+
|(sum((_2 * _3)) / sum(_3))|
+--------------------------+
|        0.9042553191489361|
+--------------------------+

但答案应该是(1.0 * 0.2 + 1.0 * 0.5)/(0.2 + 0.5)= 1.0 这是不正确的。什么?

在我看来,此类操作仅针对原始df,而不是filter_df。 WTF?

1 个答案:

答案 0 :(得分:2)

您需要在filter_df中调用它。

>>> result = spark_sum(filter_df['_2'] * filter_df['_3']) 
         / spark_sum(filter_df['_3'])

这是一个转换函数,它返回一个列并应用于我们应用它的数据帧(延迟评估)。 Sum是一个聚合函数,在没有任何组的情况下调用时,它适用于整个数据集。

>>> filter_df.select(result).show()
+--------------------------+
|(sum((_2 * _3)) / sum(_3))|
+--------------------------+
|                       1.0|
+--------------------------+