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

sim*_*ple 1 python pyspark spark-dataframe

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

>>> mydf.printSchema()
root
 |-- protocol: string (nullable = true)
 |-- source_port: long (nullable = true)
 |-- bytes: long (nullable = true)
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样聚合它时:

df_agg = mydf.groupBy('protocol').agg(sum('bytes'))
Run Code Online (Sandbox Code Playgroud)

有人告诉我:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)

现在,这对我来说没有意义,因为我看到类型适合聚合,printSchema()如上所示。

因此,我尝试将其转换为整数以防万一:

mydf_converted = mydf.withColumn("converted",mydf["bytes_out"].cast(IntegerType()).alias("bytes_converted"))
Run Code Online (Sandbox Code Playgroud)

但仍然失败:

my_df_agg_converted = mydf_converted.groupBy('protocol').agg(sum('converted'))

TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)

如何解决?我查看了这个问题,但该修复程序根本没有帮助我 - 同样的问题: PySpark DataFrame 上的 Sum 操作在类型正常时给出 TypeError

MaF*_*aFF 10

Python 在它的sum函数和sum您要使用的 pyspark 聚合函数之间感到困惑。所以你基本上是将一个字符串传递'converted'给 python sum 函数。

尝试functions使用别名加载 pyspark :

import pyspark.sql.functions as psf
my_df_agg_converted = mydf_converted.groupBy('protocol').agg(psf.sum('converted'))
Run Code Online (Sandbox Code Playgroud)

这将告诉它使用pyspark函数而不是内置函数。