【问题标题】:Flatten Parquet File with nested Arrays and StructType Spark Scala使用嵌套数组和 StructType Spark Scala 展平 Parquet 文件
【发布时间】:2019-08-11 15:55:19
【问题描述】:

我希望使用 Scala 在 Spark 中有效地动态展平镶木地板文件。我想知道实现这一目标的有效方法是什么。

parquet 文件包含多个深度级别的 Array 和 Struct 类型嵌套。 parquet 文件架构将来可能会更改,因此我无法对任何属性进行硬编码。所需的最终结果是一个扁平的分隔文件。

使用平面图和递归爆炸的解决方案会起作用吗?

示例架构:

|-- exCar: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- exCarOne: string (nullable = true)
 |    |    |-- exCarTwo: string (nullable = true)
 |    |    |-- exCarThree: string (nullable = true)
 |-- exProduct: string (nullable = true)
 |-- exName: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- exNameOne: string (nullable = true)
 |    |    |-- exNameTwo: string (nullable = true)
 |    |    |-- exNameThree: string (nullable = true)
 |    |    |-- exNameFour: string (nullable = true)
 |    |    |-- exNameCode: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- exNameCodeOne: string (nullable = true)
 |    |    |    |    |-- exNameCodeTwo: string (nullable = true)
 |    |    |-- exColor: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- exColorOne: string (nullable = true)
 |    |    |    |    |-- exColorTwo: string (nullable = true)
 |    |    |    |    |-- exWheelColor: array (nullable = true)
 |    |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |    |-- exWheelColorOne: string (nullable = true)
 |    |    |    |    |    |    |-- exWheelColorTwo: string (nullable = true)
 |    |    |    |    |    |    |--exWheelColorThree: string (nullable =true)
 |    |    |-- exGlass: string (nullable = true)
 |-- exDetails: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- exBill: string (nullable = true)
 |    |    |-- exAccount: string (nullable = true)
 |    |    |-- exLoan: string (nullable = true)
 |    |    |-- exRate: string (nullable = true)

所需的输出架构:

 exCar.exCarOne
 exCar.exCarTwo
 exCar.exCarThree
 exProduct
 exName.exNameOne
 exName.exNameTwo
 exName.exNameThree
 exName.exNameFour
 exName.exNameCode.exNameCodeOne
 exName.exNameCode.exNameCodeTwo
 exName.exColor.exColorOne
 exName.exColor.exColorTwo
 exName.exColor.exWheelColor.exWheelColorOne
 exName.exColor.exWheelColor.exWheelColorTwo
 exName.exColor.exWheelColor.exWheelColorThree
 exName.exGlass
 exDetails.exBill
 exDetails.exAccount
 exDetails.exLoan
 exDetails.exRate

【问题讨论】:

    标签: scala apache-spark apache-spark-sql parquet flatten


    【解决方案1】:

    有两件事需要做:

    1) 将数组列从最外面的嵌套数组分解到位于内部的数组:分解exName(给你很多包含exColor的json行),然后分解exColor,然后你可以分解它访问exWheelColor

    2) 将嵌套的 json 投影到单独的列。

    【讨论】:

    • 对,我认为第二步是这个问题的基础。如果没有“自加入”,如何避免这样做。例如,作为数据框 exName.exNameOne 与 exName.exNameTwo 连接的分解列与 exName.exNameCode.exNameCodeOne 连接等等。这会造成重大的扩展问题。
    • 如果您已经知道要访问数组的哪些元素,可以直接这样做:stackoverflow.com/questions/34916038/…
    • 元素/架构是动态的,因此无法完成硬编码解决方案。
    • 您选择的列名称exName.exColor.exWheelColor.exWheelColorOne/Two/Three 在我看来好像您会确切地知道您想要什么。顺便说一句,将一行结构化数据转换为一个修复模式的一行非结构化原子列的绝对要求。
    • 架构将从 parquet 文件中提取。例如,可能有一个用于 v1.00 的架构,而一周后的 v1.01,则需要以某种方式考虑到这一点。因此该文件包含该特定时间的架构。
    猜你喜欢
    • 2023-03-03
    • 2014-05-28
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2012-10-31
    • 2018-07-17
    相关资源
    最近更新 更多