【发布时间】:2019-06-27 15:38:44
【问题描述】:
我是编程新手,我正在清理和简化我的代码,以便在 pyspark 数据帧上执行 groupby 和聚合。我试图让事情更容易理解,并且一直在努力重构我的一些代码。当我尝试以下代码时,出现错误:
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 函数。
示例输入和预期输出
【问题讨论】:
-
欢迎来到 Stackoverflow。除了代码之外,您能否提供示例输入数据和预期输出?它可以帮助用户解决您的问题。谢谢。
-
问题几乎肯定出在对
concat的调用中——当它排除列时,您传入了2 个列表。请改用exprs = [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]。或者你可能想要exprs = 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]))。没有minimal reproducible example,很难分辨。 -
@pault,第一种方法奏效了!推理也很合理。太感谢了。真的很感激,伙计。
标签: apache-spark pyspark