我有一个包含以下类型的数据框:
>>> mydf.printSchema()
root
|-- protocol: string (nullable = true)
|-- source_port: long (nullable = true)
|-- bytes: long (nullable = true)
当我尝试像这样聚合时:
df_agg = mydf.groupBy('protocol').agg(sum('bytes'))
我被告知:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
现在,这对我来说没有意义,因为我看到printSchema()
中的类型可以用于聚合,如上所示。
所以,我尝试将它转换为整数只是因为:
mydf_converted = mydf.withColumn("converted",mydf["bytes_out"].cast(IntegerType()).alias("bytes_converted"))
但仍然失败:
my_df_agg_converted = mydf_converted.groupBy('protocol').agg(sum('converted'))
TypeError: unsupported operand type(s) for +: 'int' and 'str'
如何解决?我看了这个问题,但修复对我没有任何帮助 - 同样的问题: Sum operation on PySpark DataFrame giving TypeError when type is fine
答案 0 :(得分:1)
我认为您应该尝试将其转换为字符串。
第一种类型是您正在使用的类型,第二种类型是它想要的类型
答案 1 :(得分:1)
Python在它的$ patch -p1 < 64bit-patch
函数和你想要使用的pyspark聚合sum
函数之间感到困惑。因此,您基本上将字符串sum
传递给python sum函数。
尝试使用别名加载pyspark 'converted'
:
functions
这将告诉它使用import pyspark.sql.functions as psf
my_df_agg_converted = mydf_converted.groupBy('protocol').agg(psf.sum('converted'))
函数而不是内置函数。