Разбор XML-файлов с помощью Scala - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь обработать XML-файл, используя scala и spark.

У меня есть эта схема:

root
 |-- IdKey: long (nullable = true)
 |-- Value: string (nullable = true)
 |-- CDate: date (nullable = true)

И я хочу обработать этот XML-файл:

<Item>
    <CDate>2018-05-08T00:00::00</CDate>
    <ListItemData>
        <ItemData>
            <IdKey>2</IdKeyData>
            <Value>1</Value>
        </ItemData>
        <ItemData>
            <IdKey>61</IdKeyData>
            <Value>2</Value>
        </ItemData>
    <ListItemData>
</Item>

Я использую этот код:

sqlContext.read.format("com.databricks.spark.xml") .option("rowTag", "Item") .schema(schema) .load(xmlFile)

Но мой результат - таблица без столбца CDate:

+------------+
IdKey         |Value    | CDate |
+------------+
|61           |1        | null
|2            |2        | null

Можно ли разобрать xml-файл с этой схемой? Я хочу получить эти значения:

+------------+
IdKey         |Value    | CDate |
+------------+
|61           |1        | 2018-05-08T00:00::00
|2            |2        | 2018-05-08T00:00::00

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 мая 2018
you can do something like this this will output //( 2018-05-08T00:00::00   2 1   61 2   ,2018-05-08T00:00::00)
then you can format as you want i think, it will help.

  object XMLDemo extends App {
  val xmlElem: Elem = <Item>
  <CDate>2018-05-08T00:00::00</CDate>
  <ListItemData>
  <ItemData>
  <IdKeyData>2</IdKeyData>
  <Value>1</Value>
  </ItemData>
  <ItemData>
  <IdKeyData>61</IdKeyData>
  <Value>2</Value>
  </ItemData>
  </ListItemData>
  </Item>

  val lb: ListBuffer[String] = ListBuffer()
  val date: NodeSeq = xmlElem \\ "CDate"

  val r: immutable.Seq[String] = xmlElem.map {
    x => x.text
  }

  println(r.mkString(" ").replaceAll(" ","").replaceAll("\n"," "), date.text)
  }
0 голосов
/ 08 мая 2018

Я вижу ваш 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.*")

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...