Я использую искровой API-интерфейс dataframe. я пытаюсь дать sum() параметр списка, содержащий имена столбцов в виде строк. когда я помещаю имена столбцов непосредственно в функцию - скрипт работает когда я пытаюсь предоставить его функции в качестве параметра списка типов, я получаю сообщение об ошибке:
"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')
Я также попытался дать sum() список столбцов, используя
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.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 |
+---+------------+---------+
Обратите внимание, что сумма (субъект) становится нулевой, поскольку это строковый столбец. В этом случае вы можете применить 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