gpt4 book ai didi

apache-spark - 在pyspark中展平结构数组

转载 作者:行者123 更新时间:2023-12-04 00:58:47 26 4
gpt4 key购买 nike

我有一个使用 spark-xml 包转换为数据帧的 XML 文件。数据框具有以下结构:

root
|-- results: struct (nullable = true)
| |-- result: struct (nullable = true)
| | |-- categories: struct (nullable = true)
| | | |-- category: array (nullable = true)
| | | | |-- element: struct (containsNull = true)
| | | | | |-- value: string (nullable = true)

如果我选择类别列(可能在类别下多次出现):
df.select((col('results.result.categories.category')).alias("result_categories"))

对于一个记录,结果看起来像
[[result1], [result2]]

我试图压平结果:
[result1, result2]

当我使用 flatten 函数时,我收到一条错误消息:
df.select(flatten(col('results.result.categories.category')).alias("Hits_Category"))
cannot resolve 'flatten(`results`.`result`.`categories`.`category`)' due to data type mismatch: The argument should be an array of arrays, but '`results`.`result`.`categories`.`category`' is of array<struct<value:string>

我最终创建了一个 udf,并将该列传递给 udf,该 udf 会吐出该列的扁平字符串版本。

有没有更好的办法?

最佳答案

您正在尝试将 flatten 函数应用于结构数组,而它需要数组数组:

flatten(arrayOfArrays) - Transforms an array of arrays into a single array.



您不需要 UDF,您可以简单地 transform 从结构到数组的数组元素,然后使用 flatten

像这样的东西:
df.select(col('results.result.categories.category').alias("result_categories"))\
.withColumn("result_categories", expr("transform(result_categories, x -> array(x.*))"))\
.select(flatten(col("result_categories")).alias("Hits_Category"))\
.show()

关于apache-spark - 在pyspark中展平结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60379014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com