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