在 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 |
+------+----+-----+-----+
我有以下 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 |
+------+----+-----+-----+