使用嵌套阵列和StructType Spark Scala展平拼花地板文件
我期待着在Spark中使用Scala高效地动态展平镶木地板文件。我想知道实现这一目标的有效方法是什么 拼花文件包含多个深度级别的多个数组和结构类型嵌套。拼花文件模式将来可能会更改,因此我无法硬编码任何属性。所需的最终结果是平铺分隔文件 使用flatmap和递归分解的解决方案有效吗 模式示例:使用嵌套阵列和StructType Spark Scala展平拼花地板文件,scala,apache-spark,apache-spark-sql,parquet,flatten,Scala,Apache Spark,Apache Spark Sql,Parquet,Flatten,我期待着在Spark中使用Scala高效地动态展平镶木地板文件。我想知道实现这一目标的有效方法是什么 拼花文件包含多个深度级别的多个数组和结构类型嵌套。拼花文件模式将来可能会更改,因此我无法硬编码任何属性。所需的最终结果是平铺分隔文件 使用flatmap和递归分解的解决方案有效吗 模式示例: |-- exCar: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- exCar
|-- 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
有两件事需要做: 1) 将数组列从最外层的嵌套数组分解为位于内部的数组:分解
exName
(为您提供许多包含exColor
的json行),然后分解exColor
,允许您访问exWheelColor
,等等
2) 将嵌套的json投影到单独的列。需要做两件事: 1) 将数组列从最外层的嵌套数组分解为位于内部的数组:分解
exName
(为您提供许多包含exColor
的json行),然后分解exColor
,允许您访问exWheelColor
,等等
2) 将嵌套的json投影到一个单独的列。对,我认为第二步就是这个问题的基础所在。如果没有“自连接”,如何避免这样做。例如,分解后的列作为dataframe exName.exNameOne与exName.exNameTwo连接,与exName.exNameCode.exNameCodeOne连接,依此类推。这将产生重大的扩展问题。如果您已经知道要访问数组中的哪些元素,可以直接这样做:元素/模式是动态的,因此,无法使用硬编码解决方案。在我看来,您选择的列名
exName.exColor.exWheelColor.exWheelColor.exWheelColorOne/Two/Three
,似乎您完全知道自己想要什么。哪一个btw是将一行结构化数据转换为一个固定模式的一行非结构化atomar列的绝对要求。该模式将从拼花文件中提取。例如,v1.00和一周后的v1.01可能有一个模式,因此需求需要考虑到这一点。所以这个文件包含了那个特定时间的模式。对了,在第二步,我认为这是这个问题的基础。如果没有“自连接”,如何避免这样做。例如,分解后的列作为dataframe exName.exNameOne与exName.exNameTwo连接,与exName.exNameCode.exNameCodeOne连接,依此类推。这将产生重大的扩展问题。如果您已经知道要访问数组中的哪些元素,可以直接这样做:元素/模式是动态的,因此,无法使用硬编码解决方案。在我看来,您选择的列名exName.exColor.exWheelColor.exWheelColor.exWheelColorOne/Two/Three
,似乎您完全知道自己想要什么。哪一个btw是将一行结构化数据转换为一个固定模式的一行非结构化atomar列的绝对要求。该模式将从拼花文件中提取。例如,v1.00和一周后的v1.01可能有一个模式,因此需求需要考虑到这一点。因此,该文件包含该特定时间的模式。