Я вижу ваш XML как недействительный
Действительный XML должен выглядеть так в вашем случае
<Item>
<CDate>2018-05-08T00:00::00</CDate>
<ListItemData>
<ItemData>
<IdKey>2</IdKey>
<Value>1</Value>
</ItemData>
<ItemData>
<IdKey>61</IdKey>
<Value>2</Value>
</ItemData>
</ListItemData>
</Item>
Если у вас есть исправленные данные xml
, вы можете создать schema
как
val innerSchema = StructType(
StructField("ItemData",
ArrayType(
StructType(
StructField("IdKey",LongType,true)::
StructField("Value",LongType,true)::Nil
)
),true)::Nil
)
val schema = StructType(
StructField("CDate",StringType,true)::
StructField("ListItemData", innerSchema, true):: Nil
)
Примените это schema
для чтения xml
file
val df = spark.sqlContext.read.format("com.databricks.spark.xml")
.option("rowTag", "Item")
.schema(schema)
.load(xmlFile)
//Selecy nested field and explode to get the flattern result
.withColumn("ItemData", explode($"ListItemData.ItemData"))
.select("CDate", "ItemData.*") // select required column
Теперь вы можете получить необходимый вывод
+--------------------+-----+-----+
|CDate |IdKey|Value|
+--------------------+-----+-----+
|2018-05-08T00:00::00|2 |1 |
|2018-05-08T00:00::00|61 |2 |
+--------------------+-----+-----+
Вы можете позволить искре самому выводить схему, чтобы получить тот же результат
val df = spark.sqlContext.read.format("com.databricks.spark.xml")
.option("rowTag", "Item")
//.schema(schema)
.load(xmlFile)
.withColumn("ItemData", explode($"ListItemData.ItemData"))
.select("CDate", "ItemData.*")
Надеюсь, это поможет!