【问题标题】:Read XML in spark在 Spark 中读取 XML
【发布时间】:2018-05-19 20:43:13
【问题描述】:

我正在尝试使用 spark-xml jar 在 pyspark 中读取 xml/嵌套 xml。

df = sqlContext.read \
  .format("com.databricks.spark.xml")\
   .option("rowTag", "hierachy")\
   .load("test.xml"

当我执行时,数据框没有正确创建。

    +--------------------+
    |                 att|
    +--------------------+
    |[[1,Data,[Wrapped...|
    +--------------------+

下面提到了我的xml格式:

【问题讨论】:

    标签: xml apache-spark dataframe pyspark apache-spark-xml


    【解决方案1】:

    heirarchy 应该是 rootTag 并且att 应该是 rowTag 作为

    df = spark.read \
        .format("com.databricks.spark.xml") \
        .option("rootTag", "hierarchy") \
        .option("rowTag", "att") \
        .load("test.xml")
    

    你应该得到

    +-----+------+----------------------------+
    |Order|attval|children                    |
    +-----+------+----------------------------+
    |1    |Data  |[[[1, Studyval], [2, Site]]]|
    |2    |Info  |[[[1, age], [2, gender]]]   |
    +-----+------+----------------------------+
    

    schema

    root
     |-- Order: long (nullable = true)
     |-- attval: string (nullable = true)
     |-- children: struct (nullable = true)
     |    |-- att: array (nullable = true)
     |    |    |-- element: struct (containsNull = true)
     |    |    |    |-- Order: long (nullable = true)
     |    |    |    |-- attval: string (nullable = true)
    

    找到更多关于databricks xml的信息

    【讨论】:

    • 我尝试执行,但我在 WrappedArray [WrappedArray([1,...|
    • 你能分享你得到的架构吗?
    • StructType(List(StructField(Order,LongType,true),StructField(attval,StringType,true),StructField(children,StructType(List(StructField(att,ArrayType(StructType(List(StructField( Order,LongType,true),StructField(attval,StringType,true))),true),true))),true)))
    • AFAIK 这行不通。 rowTag 不能在层次结构的更深处重复。
    • @user9613318 我用 OP 发布的确切数据对其进行了测试。测试成功后只有我回答了:) 如果您认为它不起作用,请尝试
    【解决方案2】:

    Databricks 发布了新版本,可以将 xml 读取到 Spark DataFrame

    <dependency>
         <groupId>com.databricks</groupId>
         <artifactId>spark-xml_2.12</artifactId>
         <version>0.6.0</version>
     </dependency>
    

    我在此示例中使用的输入 XML 文件可在 GitHub 存储库中找到。

    val df = spark.read
          .format("com.databricks.spark.xml")
          .option("rowTag", "person")
          .xml("persons.xml")
    

    架构

    root
     |-- _id: long (nullable = true)
     |-- dob_month: long (nullable = true)
     |-- dob_year: long (nullable = true)
     |-- firstname: string (nullable = true)
     |-- gender: string (nullable = true)
     |-- lastname: string (nullable = true)
     |-- middlename: string (nullable = true)
     |-- salary: struct (nullable = true)
     |    |-- _VALUE: long (nullable = true)
     |    |-- _currency: string (nullable = true)
    

    输出:

    +---+---------+--------+---------+------+--------+----------+---------------+
    |_id|dob_month|dob_year|firstname|gender|lastname|middlename|         salary|
    +---+---------+--------+---------+------+--------+----------+---------------+
    |  1|        1|    1980|    James|     M|   Smith|      null|  [10000, Euro]|
    |  2|        6|    1990|  Michael|     M|    null|      Rose|[10000, Dollor]|
    +---+---------+--------+---------+------+--------+----------+---------------+
    

    请注意,Spark XML API 有一些限制,并在此处讨论 Spark-XML API Limitations

    希望对你有帮助!!

    【讨论】:

      【解决方案3】:

      您可以使用 Databricks jar 将 xml 解析为数据框。可以使用 maven 或 sbt 编译依赖,也可以直接使用带有 spark submit 的 jar。

      pyspark --jars /home/sandipan/Downloads/spark_jars/spark-xml_2.11-0.6.0.jar
      
      df = spark.read \
          .format("com.databricks.spark.xml") \
          .option("rootTag", "SmsRecords") \
          .option("rowTag", "sms") \
          .load("/home/sandipan/Downloads/mySMS/Sms/backupinfo.xml")
      
      Schema>>> df.printSchema()
      root
       |-- address: string (nullable = true)
       |-- body: string (nullable = true)
       |-- date: long (nullable = true)
       |-- type: long (nullable = true)
      
      >>> df.select("address").distinct().count()
      530 
      

      关注这个 http://www.thehadoopguy.com/2019/09/how-to-parse-xml-data-to-saprk-dataframe.html

      【讨论】:

      • 如果你想在 Pyspark 而不是 Scala 中使用它,这很有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多