Как загрузить сложные xml-файлы, содержащие более 1 тега строки, в фрейм данных с помощью spark scala и сохранить его в виде таблицы (обратите внимание, универсальное решение) - PullRequest
0 голосов
/ 09 марта 2019

(Это пример xml-файла с 2-мя тегами строк (любой подход для загрузки этого в информационный фрейм с n номерами тегов строк или элементов с использованием xpath в spark scala)

<book id="0">
    <author>Matthew</author>
    <publish_date>Sun Oct 01 00:00:00 EDT 2000</publish_date>
    <description>An in-depth look at creating applications with XML. 
    </description>
 <price id = "1">   
    <price>44.95</price>
    <genre>Computer</genre>
    <title>XML Developer's Guide</title>
</price>
</book>

1 Ответ

2 голосов
/ 09 марта 2019
  1. Вы можете создать схему для вышеуказанного XML-файла, как показано ниже.

    val innerSchema = StructType(
    StructField("price",
    ArrayType(
      StructType(
        StructField("price",LongType,true)::
          StructField("genre",StringType,true)::Nil
          StructField("title",StringType,true)::Nil
      )
    ),true)::Nil
    )
    
    val schema = StructType(
     StructField("author",StringType,true)::
     StructField("publish_date", StringType, nullable = true),
     StructField("description", StringType, nullable = true),
     StructField("price", innerSchema, true):: Nil
     )
    
  2. Примените эту схему для чтения XML-файла

     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
              .select("author", "publish_date", "description","price.*") // select 
                      required column
    

    Вы можете разрешить самой схеме определять искру, чтобы получить тот же результат

    val df = spark.sqlContext.read.format("com.databricks.spark.xml")
      .option("rowTag", "Item")
     //.schema(schema)
     .load(xmlFile)
     .select("author", "publish_date", "description","price.*") // select required column
    
  3. Сохранить данные в таблице Hive.

       df.write().mode(SaveMode.Overwrite).saveAsTable("dbName.tableName");
    
  4. Даже вы можете сохранить DF в базе данных, как показано ниже.

      //create properties object
      val prop = new java.util.Properties
      prop.setProperty("driver", "com.mysql.jdbc.Driver")
      prop.setProperty("user", "root")
      prop.setProperty("password", "pw") 
    
      //jdbc mysql url - destination database is named "data"
      val url = "jdbc:mysql://localhost:3306/data"
    
      //destination database table 
      val table = "sample_data_table"
    
      //write data from spark dataframe to database
      df.write.mode("append").jdbc(url, table, prop)
    

Обновление:

Чтобы сохранить DataFrame как csv

  1. Вы можете использовать блоки данныхискровой CSV.https://github.com/databricks/spark-csv

    df.write.format("com.databricks.spark.csv").save(filepath)
    
  2. В Spark 2.x пакет spark-csv не нужен, поскольку он включен в Spark.

    df.write.format("csv").save(filepath)
    

Пожалуйста, обратитесь https://github.com/databricks/spark-xml. Надеюсь, это поможет!

...