List PySpark-如何将列表传递给用户定义函数?

List PySpark-如何将列表传递给用户定义函数?,list,pyspark,user-defined-functions,List,Pyspark,User Defined Functions,我有一个有两列的数据框。第1列为“代码”,可重复1次以上,第2列为“值”。例如,第1列是1,1,1,5,5,第2列是15,18,24,38,41。我想做的是首先按两列进行排序(df.sort(“code”、“Values”),然后执行(“groupBy”“code”)和(agg Values),但我想对值应用UDF,所以我需要将每个代码的“值”作为“列表”传递给UDF。我不确定每个代码将有多少个“值”。正如您在本例中看到的,“代码”1有3个值,“代码”5有2个值。因此,对于每个“代码”,我需要将

我有一个有两列的数据框。第1列为“代码”,可重复1次以上,第2列为“值”。例如,第1列是1,1,1,5,5,第2列是15,18,24,38,41。我想做的是首先按两列进行排序(df.sort(“code”、“Values”),然后执行
(“groupBy”“code”)
和(agg Values),但我想对值应用
UDF
,所以我需要将每个代码的“值”作为“列表”传递给
UDF
。我不确定每个代码将有多少个“值”。正如您在本例中看到的,“代码”1有3个值,“代码”5有2个值。因此,对于每个“代码”,我需要将该“代码”的所有“值”作为列表传递给UDF

您可以执行groupBy,然后使用pyspark中的collect\u setcollect\u list函数。下面是您的用例的数据框架示例(我希望这就是您所指的内容):

现在使用
groupBy
collect\u list
命令:

(df
  .groupby("code")
  .agg(F.collect_list("val"))
  .show())
输出:

+------+------------------+
|code  |collect_list(val) |
+------+------------------+
|code1 |[val1, val2, val3]|
|code2 |[val1, val2]      |
+------+------------------+

在上面的第二列中有一个聚合值列表

,如果可能的话,强烈建议不要使用udf。在某些情况下,它们可以大大降低计算速度。这就是为什么我总是尝试继续使用本机spark实现的原因。如果你告诉我们,你的UDF是做什么的,我们也许可以帮助你找到一种方法。如果发现下面的答案有帮助,请向上投票。在PySpark中,我使用了这个答案,它可以用于df.groupBy(“Code”).agg({“val”:“collect_list”).show()非常感谢@ashwin agrawal为您提供的帮助。请更新答案并选择正确答案。
(df
  .groupby("code")
  .agg(F.collect_list("val"))
  .show())
+------+------------------+
|code  |collect_list(val) |
+------+------------------+
|code1 |[val1, val2, val3]|
|code2 |[val1, val2]      |
+------+------------------+