[英]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.