在 Spark 和 Scala 中阅读 XML

Read XML in Spark and Scala

我有以下 XML,我正在使用 scala 和 spark 来阅读它。

<TABLES>
    <TABLE attrname="Red">
        <ROWDATA>
            <ROW Type="solid" track="0" Unit="0"/>
        </ROWDATA>
    </TABLE>
    <TABLE attrname="Blue">
        <ROWDATA>
            <ROW Type="light" track="0" Unit="0"/>
            <ROW Type="solid" track="0" Unit="0"/>
            <ROW Type="solid" track="0" Unit="0"/>
        </ROWDATA>
    </TABLE>

这是我需要的输出:

我有以下代码,但它读取单元、轨道、类型作为列,但我需要它们在行中。这样做的最佳方法是什么?

val xmlDFF = session.read
      .option("rowTag", "TABLE")
      .xml(filePath)
      .select(explode_outer(col("ROWDATA.ROW").as("row")),col("_attrname").as("attrname"))
      .select(col("attrname")
        ,col("col._unit")
        ,col("col._track")
        ,col("col._type"))
 

检查下面的代码。

val xmlDFF = session.read
    .option("rowTag", "TABLES")
    .xml(filePath)
     .withColumn("TABLE",explode_outer($"TABLE"))
    .select(
      row_number().over(Window.partitionBy(lit(1)).orderBy(lit(1))).as("obj_id"),
      $"TABLE.*",
      explode_outer($"TABLE.ROWDATA.ROW").as("row")
    )
    .select($"obj_id",$"_attrname",explode_outer(array(
      struct(
        lit("Type").as("Name"),
        $"row._Type".as("Value")
      ),
      struct(
        lit("track").as("Name"),
        $"row._track".as("Value")
      ),
      struct(
        lit("Unit").as("Name"),
        $"row._Unit".as("Value")
      )
    )
    ).as("row"))
    .select(
      $"obj_id",
      $"_attrname".as("Type"),
      $"row.*"
    )
    .orderBy($"obj_id")
    .show(false)

输出

+------+----+-----+-----+
|obj_id|Type|Name |Value|
+------+----+-----+-----+
|1     |Red |track|0    |
|1     |Red |Type |solid|
|1     |Red |Unit |0    |
|2     |Blue|Type |light|
|2     |Blue|Unit |0    |
|2     |Blue|track|0    |
|3     |Blue|Unit |0    |
|3     |Blue|Type |solid|
|3     |Blue|track|0    |
|4     |Blue|Type |solid|
|4     |Blue|track|0    |
|4     |Blue|Unit |0    |
+------+----+-----+-----+