Извлечь фрейм данных для вложенной XML-схемы - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь прочитать XML с пользовательской схемой в кадре данных, но не могу извлечь значения.

Я попытался настроить параметры rowTag и rootTag, но ничего не работает.

Этоэто схема, которую я использую:

val input = StructType(
    Array(
      StructField("dnum", IntegerType, true),
      StructField("dtype", StringType, true),
      StructField("dname", StringType, true),
      StructField("dloc", StringType, true)))

  val bookschema = StructType(Array(
    StructField("cost", DoubleType, true),
    StructField("details", ArrayType(input, true),
      true),
    StructField("name", StringType, true),
    StructField("num", LongType, true)))

  val bookdataschema = StructType(Array(
    StructField("count", IntegerType, true),
    StructField("lang", StringType, true)))

  val schema = StructType(Array(
    StructField("bookdata", bookdataschema, true),
    StructField("book", bookschema, true)))

Вот как читается файл:

sqc.read.format("com.databricks.spark.xml")
      .option("rootTag", "books")
      .schema(schema)
      .load(filePath)

Пример xml:

<books>
    <bookdata>
        <count>4</count>
        <lang>English</lang>
    </bookdata>
    <book>
        <num>11</num>
        <name>A</name>
        <cost>200.00</cost>
        <details>
            <dnum>1</dnum>
            <dtype>X</dtype>
        </details>
        <details>
            <dnum>5</dnum>
            <dtype>A</dtype>
        </details>
    </book>
    <book>
        <num>12</num>
        <name>B</name>
        <cost>300.00</cost>
        <details>
            <dnum>2</dnum>
            <dtype>Y</dtype>

        </details>
    </book>
</books>

Ive to goо присоединении некоторых дополнительных столбцов внутри тега детали отдельной книги.Но как прочитать текущие данные в кадре данных, чтобы в нем были все строки для записей.Когда я пытаюсь прочитать его с помощью «books» как rowTag, он возвращает только 1 строку в кадре данных со значением bookdata и последним значением book.

+-----------+------------------------------------------+
|bookdata   |book                                      |
+-----------+------------------------------------------+
|[4,English]|[300.0,WrappedArray([2,Y,null,null]),B,12]|
+-----------+------------------------------------------+

В данный момент я просто забочусь о деталях тега bookпотому что мне нужно добавить некоторые вложенные теги внутри деталей, но конечный выходной файл должен также содержать данные книжных данных при записи DF в XML.Как мне это решить?

1 Ответ

0 голосов
/ 07 апреля 2019

Вы можете загрузить 2 фрейма данных: один содержит ваши book данные, а другой - bookdata:

val df = spark.read.format("com.databricks.spark.xml")
      .option("rootTag", "books")
      .option("rowTag", "book")
      .schema(bookschema)
      .load(filePath)

df.show()
/*
df has the books data:
+-----+--------------------+----+---+
| cost|             details|name|num|
+-----+--------------------+----+---+
|200.0|[[1, X,,], [5, A,,]]|   A| 11|
|300.0|          [[2, Y,,]]|   B| 12|
+-----+--------------------+----+---+
*/

val df2 = spark.read.format("com.databricks.spark.xml")
      .option("rootTag", "books")
      .option("rowTag", "bookdata")
      .schema(bookdataschema)
      .load(filePath)

df2.show()
/*
df2 has the bookdata data:
+-----+-------+
|count|   lang|
+-----+-------+
|    4|English|
+-----+-------+
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...