为什么pyspark agg告诉我这里的数据类型不正确?

时间:2017-09-02 00:44:45

标签: python pyspark spark-dataframe

我有一个包含以下类型的数据框:

>>> 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

2 个答案:

答案 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')) 函数而不是内置函数。