Python PySpark UDF返回大小可变的元组
我获取一个现有的数据帧,并创建一个包含元组的字段的新数据帧。自定义项用于生成此字段。例如,在这里,我获取一个源元组并修改其元素以生成一个新元组:Python PySpark UDF返回大小可变的元组,python,apache-spark,pyspark,apache-spark-sql,user-defined-functions,Python,Apache Spark,Pyspark,Apache Spark Sql,User Defined Functions,我获取一个现有的数据帧,并创建一个包含元组的字段的新数据帧。自定义项用于生成此字段。例如,在这里,我获取一个源元组并修改其元素以生成一个新元组: udf( lambda x: tuple([2*e for e in x], ...) 挑战在于元组的长度事先未知,并且可以在行与行之间更改 根据阅读相关讨论的理解,要返回元组,UDF的返回类型必须声明为StructType。但是,由于返回的元组中的元素数量未知,因此我不能只编写如下内容: StructType([ StructField("
udf( lambda x: tuple([2*e for e in x], ...)
挑战在于元组的长度事先未知,并且可以在行与行之间更改
根据阅读相关讨论的理解,要返回元组,UDF的返回类型必须声明为StructType。但是,由于返回的元组中的元素数量未知,因此我不能只编写如下内容:
StructType([
StructField("w1", IntegerType(), False),
StructField("w2", IntegerType(), False),
StructField("w3", IntegerType(), False)])
似乎可以返回列表,但列表对我来说不起作用,因为我需要在输出数据帧中使用一个可哈希对象
我有什么选择
提前感谢
结构类型
/行
表示固定大小的对象,不能用于表示可变大小的对象
要表示同构集合,请将list
用作外部类型,将ArrayType
用作SQL类型:
udf(lambda x: [2*e for e in x], ArrayType(IntegerType()))
或(Spark 2.2或更高版本):
一次一行的每个Databricks(Spark)的新语法(语法更符合Pandas UDF,这似乎是python中UDF的发展方向):
一次一行:
@udf(ArrayType(IntegerType()))
def new_tuple(x):
return [2*e for e in x]
谢谢你的快速回复。ArrayType()可以工作。与常规Python数组/列表不同,ArrayType似乎是可哈希的。当使用此类型作为join()和其他Dataframe和SQL操作的键时,是否有任何问题(主要是速度)需要注意?一般来说,复杂结构很难处理,只有一些操作可以使用本机函数表示。其余部分将需要
udf
,这非常昂贵,尤其是在Python中。
from pyspark.sql.functions import expr
expr("tranform(input_column, x -> 2 * x)")
@udf(ArrayType(IntegerType()))
def new_tuple(x):
return [2*e for e in x]