繁体   English   中英

将可变数量的列传递给 Pyspark .Agg()

[英]Passing variable number of columns to Pyspark .Agg()

在 PySpark 中,我需要在运行时构建一个列列表,然后对它们进行聚合。

这是一个有效的例子:

T.agg(col1,col2)

但我需要传递一个列类型 List of Column (不是字符串)

不起作用:

cols=[col1,col2]   
T.agg(cols)     #Passes param as tupple1(List) 

不起作用:

cols=[col1,col2]    
T.agg(tupple(cols))      #Passes param as tupple1(tupple2)

两种情况都在 PySpark 代码上失败: assert all(isinstance(c, Column) for c in exprs), "all exprs should be Column"

问题是 Python 将列表作为 tupple1 传递,我需要传递一个列列表。 解决办法是什么?

问题是您需要将列表解压缩为单个参数。 您可以使用*运算符执行此操作。

T.agg(*cols)

*解包列表中的元素。 这是另一个独立于 PySpark 的玩具示例。

def test(a, b, c, d):
    print(a, b, c, d)

data = [3, 4, 5, 6]
test(*data)

# Output:
# 3 4 5 6

根据评论,如果您想进行“第一次”聚合,可以执行以下操作:

col_list = ['col1', 'col2']
exprs = [first(i).alias("first_"+i) for i in col_list]

df.groupBy("some_col").agg(*exprs).show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM