PySpark DataFrame 上的求和操作在类型正常时给出 TypeError
Posted
技术标签:
【中文标题】PySpark DataFrame 上的求和操作在类型正常时给出 TypeError【英文标题】:Sum operation on PySpark DataFrame giving TypeError when type is fine 【发布时间】:2016-08-11 16:05:07 【问题描述】:我在 PySpark 中有这样的 DataFrame(这是 take(3) 的结果,dataframe 很大):
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)
那么这里发生了什么?
【问题讨论】:
你确定你的所有台词都正常吗?我的意思是,您是否检查了所有行的 a_d 值是否有效? @mark91 a_d 字段来自另一个数据帧中两个双列的乘法,我认为它不可能是一个字符串。有没有办法检查这个? 您可以执行一些操作,例如获取底层 RDD 并使用字段 a_d.. 上的 RegExp 对其进行过滤。或者您可以将结果写入 Hive 表并在读取它的列中查找 NULL通过 Hive... 或者,如果您有显示此问题的少数数据的子集,您甚至可以检查它... 【参考方案1】:您使用的不是正确的 sum 函数,而是 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|
# +-----+-------+
【讨论】:
您使用的是什么版本的 spark ?因为我无法重现错误,除非它是内置函数 sum。你是在 pyspark 中运行它还是提交你的脚本? 你能在你的 pyspark 中写下sum
并在此处更新输出吗?
对不起,我的错,我确信我已经进口了,但我没有。你能详细说明为什么内置失败,它在哪里看到一个 str ?以上是关于PySpark DataFrame 上的求和操作在类型正常时给出 TypeError的主要内容,如果未能解决你的问题,请参考以下文章
pyspark/EMR 中大型 DataFrame 上的 collect() 或 toPandas()
过滤器生成的 PySpark DataFrame - 它存储在哪里?