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()选项,结果成功了。我还将尝试另一种解决方案