关于如何解决以下问题的想法用完了。Glue数据目录中的一个表具有以下模式:
root
|-- _id: string
|-- _field: struct
| |-- ref: choice
| | |-- array
| | | |-- element: struct
| | | | |-- value: null
| | | | |-- key: string
| | | | |-- name: string
| | |-- struct
| | | |-- value: null
| | | |-- key: choice
| | | | |-- int
| | | | |-- string
| | | |-- name: string
如果我尝试使用解决ref
选项
resolved = (
df.
resolveChoice(
specs = [('_field.ref','cast:array')]
)
)
我失去了记录。
关于我该怎么做的任何想法:
- 根据
_field.ref
是array
还是struct
过滤DataFrame - 将
struct
记录转换为array
,反之亦然
我使用解决了自己的问题
resolved_df = ResolveChoice.apply(df, choice = "make_cols")
这将把array
值保存在新的ref_array
列中,把struct
值保存在ref_struct
列中。
这使我能够通过拆分DataFrame
resolved_df1 = resolved_df.filter(col("ref_array").isNotNull()).select(col("ref_array").alias("ref"))
resolved_df2 = resolved_df.filter(col("ref_struct").isNotNull()).select(col("ref_struct").alias("ref"))
在将数组转换为仅结构(使用explode()
(或将结构转换为使用array()
的数组后,重新组合