如何从spark数据框中的嵌套结构中仅提取某些属性级别

时间:2018-01-09 09:37:56

标签: scala apache-spark data-structures spark-dataframe

我们希望将嵌套数据结构分解为单独的实体,并使用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)

我们希望在单独的数据集合中包含合同,项目和子项目。子实体应包含对其父级的引用,以及作为审计字段的顶级字段(时间戳)。

合同:

  • auditTimestamp
  • 类别
  • contractId

产品:

  • auditTimestamp
  • contractId(foreignKey)
  • 活性
  • 的itemId

子项:

  • auditTimestamp
  • itemId(foreignKey)
  • elementID

我们不希望具体配置所有必需的属性,但只想提取相应的父属性,foreignKey(引用),以及不应提取的内容(例如,合同不应包含项目,项目不应包含子元素)。

我们尝试使用dataframe.select("*").select(explode("contract.*"))之类的,但我们无法做到。 欢迎任何有关如何优雅地做到这一点的想法。

最佳

亚历

1 个答案:

答案 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)?