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_setcollect_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 |
    +---+-------+

现在是groupBycollect_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 - 如何将列表传递给用户定义函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表传递给pyspark中的selectExpr方法?

如何将输入传递到用户定义函数中的命名列表

如何将局部变量传递给熊猫中的用户定义函数?

如何将二维数组传递给用户定义的函数?

udf(用户定义函数)如何在 pyspark 中工作?

如何将数组传递给 Spark (UDAF) 中的用户定义聚合函数