pyspark中的结构的扁平化数组

问题描述 投票:0回答:1

我有一个使用spark-xml包转换为dataframe的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会吐出该列的扁平字符串版本。

有更好的方法吗?

pyspark pyspark-sql pyspark-dataframes
1个回答
1
投票

[您正在尝试将flatten函数应用于结构数组,但它期望数组数组:

flatten-将数组的数组转换为单个数组。

您不需要UDF,只需将flatten(arrayOfArrays)数组元素从结构到数组,然后使用transform

类似这样的东西:

transform
© www.soinside.com 2019 - 2024. All rights reserved.