PySpark UDF返回可变大小的元组

2024-03-29 13:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我获取一个现有的数据帧并用一个包含元组的字段创建一个新的数据帧。UDF用于生成此字段。例如,在这里,我获取一个源元组并修改其元素以生成一个新元组:

udf( lambda x: tuple([2*e for e in x], ...)

问题是元组的长度事先不知道,并且可以在行与行之间变化。在

根据我阅读相关讨论的了解,要返回元组,UDF的返回类型必须声明为StructType。但是,由于返回的元组中的元素数量未知,所以我不能只写如下内容:

^{pr2}$

似乎可以返回列表,但列表对我不起作用,因为我需要输出数据帧中的散列对象。在

我有什么选择?在

提前谢谢


Tags: 数据lambdain声明元素类型内容列表
2条回答

每次一行的新语法per Databricks(Spark)(语法更符合Pandas UDF,这似乎是UDF在pythonhttps://databricks.com/blog/2017/10/30/introducing-vectorized-udfs-for-pyspark.html)中的发展方向:

一次一行:

@udf(ArrayType(IntegerType()))
def new_tuple(x):
    return [2*e for e in x]

StructType/Row表示固定大小的product type对象,不能用于表示可变大小的对象。在

若要表示同构集合,请使用list作为外部类型,ArrayType作为SQL类型:

udf(lambda x: [2*e for e in x], ArrayType(IntegerType()))

或(Spark 2.2或更高版本):

^{pr2}$

在Spark 2.4或更高版本中,您可以使用transform

from pyspark.sql.functions import expr

expr("tranform(input_column, x -> 2 * x)")

相关问题 更多 >