在两个列列表上执行复杂的聚合?

时间:2019-06-27 15:38:44

标签: apache-spark pyspark

我是编程新手,正在清理和简化代码以在pyspark数据帧上执行分组和聚合。我试图使事情更容易理解,并且一直在努力重构我的一些代码。当我尝试以下代码时,出现错误:

TypeError: Invalid argument, not a string or column: 

这是我的代码:

groupBy = ['ColA']

convert_to_list = ['Col1', 'Col2', 'Col3',]
convert_to_set = ['Col4', 'Col5', 'Col6',]

fun_list = [F.collect_list]
funs_set = [F.collect_set]

exprs = F.concat(
    [f(F.col(c)) for f in fun_list for c in convert_to_list], 
    [f(F.col(c)) for f in funs_set for c in convert_to_set]
)

df = df.groupby(*groupBy).agg(*exprs)

非常感谢您的帮助。我不确定如何将正确的列传递给agg函数。

样本输入和预期输出

enter image description here

an

1 个答案:

答案 0 :(得分:1)

您的问题是对concat的调用-当您希望参数为列时,您要传递2个列表。看来您想将这些列表连接在一起,可以使用python中的加法运算符来完成。

尝试:

exprs = (
    [f(F.col(c)).alias(c) for f in fun_list for c in convert_to_list] + 
    [f(F.col(c)).alias(c) for f in funs_set for c in convert_to_set]
)

我还添加了对alias的调用,以便在聚合后保留列名。