PySpark - 如何将列表传递给用户定义函数?
Posted
技术标签:
【中文标题】PySpark - 如何将列表传递给用户定义函数?【英文标题】:PySpark - How to pass a list to User Define Function? 【发布时间】:2020-01-07 03:59:34 【问题描述】:我有一个包含 2 列的 DataFrame。第 1 列是“代码”,可以重复超过 1 次,第 2 列是“值”。例如,第 1 列是 1,1,1,5,5,第 2 列是 15,18,24,38,41。我想做的是首先按两列( df.sort("code","Values") )
排序,然后执行("groupBy" "Code")
和(agg 值),但我想在值上应用UDF
,所以我需要传递每个代码的“值”作为UDF
的“列表”。我不确定每个代码会有多少“值”。正如您在此示例中看到的那样,“代码”1 有 3 个值,而“代码”5 有 2 个值。因此,对于每个“代码”,我需要将该“代码”的所有“值”作为列表传递给UDF
。
【问题讨论】:
如果可能,强烈建议不要使用 udf。在某些情况下,它们可以大大减慢计算时间。这就是为什么我总是会尝试继续使用本机 spark 实现。如果您告诉我们您的 UDF 是做什么的,我们或许可以帮助您找到一种方法。 如果发现有帮助,请点赞以下答案。 【参考方案1】:您可以执行groupBy
,然后在pyspark 中使用collect_set
或collect_list
函数。以下是您的用例的示例数据框(我希望这就是您所指的):
from pyspark import SparkContext
from pyspark.sql import HiveContext
sc = SparkContext("local")
sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame([
("code1", "val1"),
("code1", "val2"),
("code1", "val3"),
("code2", "val1"),
("code2", "val2"),
], ["code", "val"])
df.show()
+-----+-----+
| code| val |
+-----+-----+
|code1|val1 |
|code1|val2 |
|code1|val3 |
|code2|val1 |
|code2|val2 |
+---+-------+
现在是groupBy
和collect_list
命令:
(df
.groupby("code")
.agg(F.collect_list("val"))
.show())
输出:
+------+------------------+
|code |collect_list(val) |
+------+------------------+
|code1 |[val1, val2, val3]|
|code2 |[val1, val2] |
+------+------------------+
在上面你会得到第二列中的聚合值列表
【讨论】:
在 PySpark 中我使用了这个,它可以工作 df.groupBy("Code").agg("val":"collect_list").show() 非常感谢@ashwin agrawal你的帮助 请为答案投票并选择正确的答案。以上是关于PySpark - 如何将列表传递给用户定义函数?的主要内容,如果未能解决你的问题,请参考以下文章