Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark UDF返回大小可变的元组_Python_Apache Spark_Pyspark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

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]