Искра sql-предоставление параметра списка для функции суммы

Я использую искровой 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))

Тоже не работал

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
284
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Распакуйте свой список, используя нотацию звездочки:

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

Другие вопросы по теме