Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark pyspark获取udf中结构数据类型的字段名_Apache Spark_Pyspark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

Apache spark pyspark获取udf中结构数据类型的字段名

Apache spark pyspark获取udf中结构数据类型的字段名,apache-spark,pyspark,apache-spark-sql,user-defined-functions,Apache Spark,Pyspark,Apache Spark Sql,User Defined Functions,我试图将多列作为StructType(使用pyspark.sql.functions.struct())传递给udf 在这个udf中,我想获取作为列表传递的struct列的字段,这样我就可以迭代每一行传递的列 基本上,我正在寻找这个答案中提供的scala代码的pyspark版本-您可以使用与您链接的帖子相同的方法,即使用。但是,您可以使用来将行转换为字典,而不是.schema.fieldNames 例如,下面是一种同时迭代列名和列值的方法: from pyspark.sql.functions

我试图将多列作为
StructType
(使用
pyspark.sql.functions.struct()
)传递给
udf

在这个
udf
中,我想获取作为
列表传递的struct列的字段,这样我就可以迭代每一行传递的列


基本上,我正在寻找这个答案中提供的scala代码的pyspark版本-

您可以使用与您链接的帖子相同的方法,即使用。但是,您可以使用来将
转换为字典,而不是
.schema.fieldNames

例如,下面是一种同时迭代列名和列值的方法:

from pyspark.sql.functions import col, struct, udf

df = spark.createDataFrame([(1, 2, 3)], ["a", "b", "c"])
f = udf(lambda row: "; ".join(["=".join(map(str, [k,v])) for k, v in row.asDict().items()]))
df.select(f(struct(*df.columns)).alias("myUdfOutput")).show()
#+-------------+
#|  myUdfOutput|
#+-------------+
#|a=1; c=3; b=2|
#+-------------+

另一种方法是将列名构建为value的
MapType()
,并将其传递给您的
udf

from itertools import chain
from pyspark.sql.functions import create_map, lit

f2 = udf(lambda row: "; ".join(["=".join(map(str, [k,v])) for k, v in row.items()]))
df.select(
    f2(
        create_map(
            *chain.from_iterable([(lit(c), col(c)) for c in df.columns])
        )
    ).alias("myNewUdfOutput")
).show()
#+--------------+
#|myNewUdfOutput|
#+--------------+
#| a=1; c=3; b=2|
#+--------------+
第二种方法可能不必要地复杂,因此第一种方法是推荐的方法。

谢谢!我尝试了.asDict()选项,结果成功了。我还将尝试另一种解决方案