use*_*013 3 apache-spark apache-spark-sql pyspark pyspark-dataframes
我有一个使用 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)
Run Code Online (Sandbox Code Playgroud)
如果我选择类别列(可能在类别下多次出现):
df.select((col('results.result.categories.category')).alias("result_categories"))
Run Code Online (Sandbox Code Playgroud)
对于一个记录,结果看起来像
[[result1], [result2]]
Run Code Online (Sandbox Code Playgroud)
我试图压平结果:
[result1, result2]
Run Code Online (Sandbox Code Playgroud)
当我使用 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>
Run Code Online (Sandbox Code Playgroud)
我最终创建了一个 udf,并将该列传递给 udf,该 udf 会吐出该列的扁平字符串版本。
有没有更好的办法?
您正在尝试将flatten函数应用于结构数组,而它需要数组数组:
flatten(arrayOfArrays)- 将数组数组转换为单个数组。
您不需要 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4042 次 |
| 最近记录: |