我在PySpark中有这样的DataFrame(这是一个take(3)的结果,数据帧非常大):
sc = SparkContext()
df = [Row(owner=u'u1', a_d=0.1), Row(owner=u'u2', a_d=0.0), Row(owner=u'u1', a_d=0.3)]
相同的所有者会有更多行。我需要做的是在分组后将每个所有者的字段a_d的值相加为
b = df.groupBy('owner').agg(sum('a_d').alias('a_d_sum'))
但这会引发错误
TypeError:+:' int'不支持的操作数类型和' str'
但是,架构包含双精度值,而不是字符串(这来自printSchema()):
root
|-- owner: string (nullable = true)
|-- a_d: double (nullable = true)
那么这里发生了什么?
答案 0 :(得分:22)
您没有使用正确的求和函数,而是使用built-in
函数sum
(默认情况下)。
因此build-in
函数不起作用的原因是
这是一个可迭代的参数,其中传递的列的名称是一个字符串,built-in
函数不能应用于字符串。 Ref. Python Official Documentation
您需要从pyspark.sql.functions
导入正确的功能:
from pyspark.sql import Row
from pyspark.sql.functions import sum as _sum
df = sqlContext.createDataFrame(
[Row(owner=u'u1', a_d=0.1), Row(owner=u'u2', a_d=0.0), Row(owner=u'u1', a_d=0.3)]
)
df2 = df.groupBy('owner').agg(_sum('a_d').alias('a_d_sum'))
df2.show()
# +-----+-------+
# |owner|a_d_sum|
# +-----+-------+
# | u1| 0.4|
# | u2| 0.0|
# +-----+-------+