在 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 文件