在 Spark 中读取 XML

Posted

技术标签:

【中文标题】在 Spark 中读取 XML【英文标题】:Read XML in spark 【发布时间】: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格式:

【问题讨论】:

【参考方案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 中使用它,这很有用。

以上是关于在 Spark 中读取 XML的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)

使用 spark 读取 xml 时如何识别或重新路由错误的 xml

Azure Databricks Spark XML 库 - 尝试读取 xml 文件

Spark 不读取 hive-site.xml?

使用 spark xml 读取值 xml 标记值,想要获取值但给我列表

通过spark-sql快速读取hive中的数据