我们希望将嵌套数据结构分解为单独的实体,并使用Spark&斯卡拉。 结构如下:
root
|-- timestamp: string (nullable = true)
|-- contract: struct (nullable = true)
| |-- category: string (nullable = true)
| |-- contractId: array (nullable = true)
| |-- items: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- active: boolean (nullable = true)
| | | |-- itemId: string (nullable = true)
| | | |-- subItems: array (nullable = true)
| | | | |-- element: struct (containsNull = true)
| | | | | |-- elementId: string (nullable = true)
我们希望在单独的数据集合中包含合同,项目和子项目。子实体应包含对其父级的引用,以及作为审计字段的顶级字段(时间戳)。
合同:
产品:
子项:
我们不希望具体配置所有必需的属性,但只想提取相应的父属性,foreignKey(引用),以及不应提取的内容(例如,合同不应包含项目,项目不应包含子元素)。
我们尝试使用dataframe.select("*").select(explode("contract.*"))
之类的,但我们无法做到。
欢迎任何有关如何优雅地做到这一点的想法。
亚历
答案 0 :(得分:1)
这是关于如何压平一排。 'explode'函数应该在数组上使用。
dataframe.select("*")
.select(explode("contract.items.*").alias("ci_flat"))
.select("ci_flat.itemId", "ci_flat.subItems")
参考文献: Flattening Rows in Spark What's the difference between explode function and operator? How to unwind array in DataFrame (from JSON)?