【发布时间】:2018-10-23 02:07:43
【问题描述】:
我正在尝试对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()吗? -
当我这样做的时候` result.show()
, it gave me the following error: Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'Column' object is not callable -
哈,我显然不知道足够的火花来回答这个问题(我什至没有安装这个东西......)
-
请注意,
df标签用于该名称的 Unix 命令,与数据帧无关。
标签: dataframe pyspark pyspark-sql