【问题标题】:Performing complex aggregate on two lists of columns?在两个列列表上执行复杂聚合?
【发布时间】: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


【解决方案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 的调用,以便在聚合后保留列名。

【讨论】:

  • 这很好用,谢谢。现在我尝试将其转换为 UDF,但出现错误:``` @F.udf def aggregation(df, groupby_column, cols_to_list, cols_to_set): fun_list = [F.collect_list] funs_set = [F.collect_set] exprs = [F.collect_set(F.col(c)).alias(c) for c in cols_to_list]\ + [F.collect_set(F.col(c)).alias(c) in funs_set for c in cols_to_set] 返回df.groupby(*groupby_column).agg(*exprs) ``` ``` TypeError: Invalid argument, not a string or column: DataFrame ``` 你可能知道这里会发生什么吗?
  • 很难解释评论中的代码 - 尝试发布一个新问题,但一定要包含 reproducible exampledon't post pictures of code or data
  • 完成。如果你有机会,我会非常感谢你的帮助,保罗。链接:stackoverflow.com/questions/56796231/…
猜你喜欢
  • 2020-09-15
  • 2015-08-13
  • 2013-05-05
  • 2019-02-09
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多