Apache spark spark sql为求和函数提供列表参数

Apache spark spark sql为求和函数提供列表参数,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,im使用spark数据帧API。 我试图为sum()提供一个列表参数,该参数包含作为字符串的列名。 当我将列名直接放入函数中时,脚本工作正常 当我试图将其作为list类型的参数提供给函数时,我得到错误: "py4j.protocol.Py4JJavaError: An error occurred while calling o155.sum. : java.lang.ClassCastException: java.util.ArrayList cannot be cast to j

im使用spark数据帧API。 我试图为sum()提供一个列表参数,该参数包含作为字符串的列名。 当我将列名直接放入函数中时,脚本工作正常 当我试图将其作为list类型的参数提供给函数时,我得到错误:

"py4j.protocol.Py4JJavaError: An error occurred while calling o155.sum.
: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String"
对groupBy()使用相同类型的列表参数是可行的。 这是我的剧本:

groupBy_cols = ['date_expense_int', 'customer_id']
agged_cols_list = ['total_customer_exp_last_m','total_customer_exp_last_3m']

df = df.groupBy(groupBy_cols).sum(agged_cols_list)
当我这样写的时候,它是有效的:

df = df.groupBy(groupBy_cols).sum('total_customer_exp_last_m','total_customer_exp_last_3m')
我还尝试使用

agged_cols_list2 = []
for i in agged_cols_list:
    agged_cols_list2.append(col(i))

也不起作用

使用星号符号打开列表:

df = df.groupBy(groupBy_cols).sum(*agged_cols_list)

使用星号符号打开列表:

df = df.groupBy(groupBy_cols).sum(*agged_cols_list)

如果您有一个类似于下面的df,并且希望对字段列表求和

df.show(5,truncate=False)

+---+---------+----+
|id |subject  |mark|
+---+---------+----+
|100|English  |45  |
|100|Maths    |63  |
|100|Physics  |40  |
|100|Chemistry|94  |
|100|Biology  |74  |
+---+---------+----+

only showing top 5 rows

agged_cols_list=['subject', 'mark']

df.groupBy("id").agg(*[sum(col(c)) for c in agged_cols_list]).show(5,truncate=False)

+---+------------+---------+
|id |sum(subject)|sum(mark)|
+---+------------+---------+
|125|null        |330.0    |
|124|null        |332.0    |
|155|null        |304.0    |
|132|null        |382.0    |
|154|null        |300.0    |
+---+------------+---------+
请注意,sum(subject)是一个字符串列,因此为null。 在这种情况下,您可能希望对主题应用count,对标记应用sum。所以你可以用字典

summary={ "subject":"count","mark":"sum" }

df.groupBy("id").agg(summary).show(5,truncate=False)

+---+--------------+---------+
|id |count(subject)|sum(mark)|
+---+--------------+---------+
|125|5             |330.0    |
|124|5             |332.0    |
|155|5             |304.0    |
|132|5             |382.0    |
|154|5             |300.0    |
+---+--------------+---------+
only showing top 5 rows

如果您有一个类似于下面的df,并且希望对字段列表求和

df.show(5,truncate=False)

+---+---------+----+
|id |subject  |mark|
+---+---------+----+
|100|English  |45  |
|100|Maths    |63  |
|100|Physics  |40  |
|100|Chemistry|94  |
|100|Biology  |74  |
+---+---------+----+

only showing top 5 rows

agged_cols_list=['subject', 'mark']

df.groupBy("id").agg(*[sum(col(c)) for c in agged_cols_list]).show(5,truncate=False)

+---+------------+---------+
|id |sum(subject)|sum(mark)|
+---+------------+---------+
|125|null        |330.0    |
|124|null        |332.0    |
|155|null        |304.0    |
|132|null        |382.0    |
|154|null        |300.0    |
+---+------------+---------+
请注意,sum(subject)是一个字符串列,因此为null。 在这种情况下,您可能希望对主题应用count,对标记应用sum。所以你可以用字典

summary={ "subject":"count","mark":"sum" }

df.groupBy("id").agg(summary).show(5,truncate=False)

+---+--------------+---------+
|id |count(subject)|sum(mark)|
+---+--------------+---------+
|125|5             |330.0    |
|124|5             |332.0    |
|155|5             |304.0    |
|132|5             |382.0    |
|154|5             |300.0    |
+---+--------------+---------+
only showing top 5 rows