PySpark DataFrame求和。

4

我正在尝试对 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。什么鬼?

你是不是想要执行 result.show() 呢? - cs95
当我执行result.show()时,它给了我以下错误:Traceback (most recent call last): File "", line 1, in TypeError: 'Column' object is not callable` - Nygen Patricia
哈哈,我显然不了解足够的Spark来回答这个问题(我甚至没有安装它...) - cs95
请注意,df标签是Unix命令的名称,并与数据帧无关。 - Caleb
1个回答

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|
+--------------------------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接