чтение XML-файла с закрытым тегом и множеством атрибутов в Scala - PullRequest
1 голос
/ 01 июля 2019

Я читаю XML-файл в Scala

<tag1>
  <tag2 id="0" attr1="abc" ... />
  ..
</tag1>

Это уже было сообщено как проблема и закрыто. https://github.com/databricks/spark-xml/pull/303

Однако я не могу решить это.

import org.apache.spark.sql.SparkSession
import com.databricks.spark.xml._
import org.apache.spark.sql.types.{StructType, StructField, DoubleType,StringType}
import org.apache.spark.sql.{Row, SaveMode}

object stack {
  def main(args: Array[String]) {
    val spark = SparkSession.builder.getOrCreate()

    val customSchema = StructType(Array(
      StructField("id", DoubleType, nullable = true),
      StructField("attr1", StringType, nullable = true),
      ...
      ...
    ))  
    val df = spark.read
        .option("rowTag", "tag2")
        .format("com.databricks.spark.xml")
        .schema(customSchema)
        .load("dummy.xml")

    import spark.sql
    import spark.implicits._

    df.createOrReplaceTempView("temp1")
    sql("SELECT * from temp1 limit 5").show()
  }
}

Однако df.show(5) не отображает строк.

В резолюции говорится об использовании XmlInputFormat, который я не пробовал, если кто-то может помочь, то это будет полезно.

Подобный тип решения работает с вложенным XML-файлом.

<books>
  <book> .. </book>
  <name> abc </name>
</books>

Я хочу увидеть кадр данных со значениями для отображения. а позже я хочу прочитать много XML-файлов и присоединиться к ним в SQL-запрос.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вам необходимо добавить _ префикс для атрибутов.

Данные (dummy.xml):

<tag1>
    <tag2 id="0" attr1="abc"/>
    <tag2 id="1" attr1="abd" />
    <tag2 id="2" attr1="abd" />
</tag1>

Решение:

package main

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType}

object Main extends App {
  val spark = SparkSession.builder.config("spark.master", "local").getOrCreate()

  val customSchema = StructType(Array(
    StructField("_id", DoubleType, nullable = true),
    StructField("_attr1", StringType, nullable = true)
  ))
  val df = spark.read
    .option("rowTag", "tag2")
    .format("com.databricks.spark.xml")
    .schema(customSchema)
    .load("dummy.xml")
  import spark.sql

  df.createOrReplaceTempView("temp1")
  sql("SELECT * from temp1 limit 5").show()
}

Результат:

+---+------+
|_id|_attr1|
+---+------+
|0.0|   abc|
|1.0|   abd|
|2.0|   abd|
+---+------+

Как я понял:

  1. Нашел эту проблему со схемой, потому что она работает с дочерними элементами
  2. Удалить (или комментарий) пользовательской схемы (// .schema(customSchema))
  3. Печать схемы с разрешением искры (df.printSchema())
  4. Найдите то, что вам нужно
  5. Создать новую схему

См. Также: Извлечение атрибутов тега из xml с использованием sparkxml

PS: простите за мой английский

0 голосов
/ 03 июля 2019

Спасибо Михаил за руководство, однако проблема была очень маленькой.Извините, что не предоставил фактическую запись файла XML ранее, так как проблема была в атрибутах.

<users>
    <row Id="-1" Reputation="1" ..... />
</users>

Атрибуты начинались с заглавных букв, когда я сделал их маленькими, тогда это мое решение начало работать (конечно, я напечаталсхема перед ее использованием по предложению Михаила)

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