【问题标题】:Sum operation on PySpark DataFrame giving TypeError when type is finePySpark DataFrame 上的求和操作在类型正常时给出 TypeError
【发布时间】: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... 或者,如果您有显示此问题的少数数据的子集,您甚至可以检查它...

标签: python apache-spark dataframe pyspark


【解决方案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 ?
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 2019-08-21
  • 2018-12-13
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多