XML文件

本文描述了如何读和写一个XML文件作为一个Apache火花数据源。

需求

  1. 创建spark-xml图书馆作为一个Maven库。对于Maven坐标,指定:

    • com.databricks: spark-xml_2.12: <版本>

    看到spark-xml释放< / >的最新版本<版本>

  2. 安装库在一个集群中。

例子

本节中的示例使用了书< / >XML文件。

  1. 检索图书XML文件:

    wget https://github.com/databricks/spark-xml/raw/master/src/test/resources/books.xml美元
  2. 上传文件DBFS

读取和写入XML数据

/ * * /推断模式创建使用xml选项(路径“dbfs: / books.xml”,rowTag“书”)/ * * /指定列的名称和类型创建(作者字符串,描述字符串,类型字符串,_id字符串,价格,publish_date字符串,标题字符串)使用xml选项(路径“dbfs: / books.xml”,rowTag“书”)
/ /推断模式进口com火花xml_/ /添加DataFrame.read.xml()方法瓦尔df=火花选项(“rowTag”,“书”)xml(“dbfs: / books.xml”)瓦尔selectedData=df选择(“作者”,“_id”)selectedData选项(“rootTag”,“书”)选项(“rowTag”,“书”)xml(“dbfs: / newbooks.xml”)/ /指定模式进口orgapache火花sql类型。{StructType,StructField,StringType,倍增式}瓦尔customSchema=StructType(数组(StructField(“_id”,StringType,可以为空=真正的),StructField(“作者”,StringType,可以为空=真正的),StructField(“描述”,StringType,可以为空=真正的),StructField(“类型”,StringType,可以为空=真正的),StructField(“价格”,倍增式,可以为空=真正的),StructField(“publish_date”,StringType,可以为空=真正的),StructField(“标题”,StringType,可以为空=真正的)))瓦尔df=火花选项(“rowTag”,“书”)模式(customSchema)xml(“books.xml”)瓦尔selectedData=df选择(“作者”,“_id”)selectedData选项(“rootTag”,“书”)选项(“rowTag”,“书”)xml(“dbfs: / newbooks.xml”)
#推断模式图书馆(SparkR)sparkR.session(“地方[4]”,sparkPackages=c(“com.databricks: spark-xml_2.12: <版本>”))df< -read.df(“dbfs: / books.xml”,=“xml”,rowTag=“书”)#默认“rootTag”和“rowTag”write.df(df,“dbfs: / newbooks.xml”,“xml”)#指定模式customSchema< -structType(structField(“_id”,“字符串”),structField(“作者”,“字符串”),structField(“描述”,“字符串”),structField(“类型”,“字符串”),structField(“价格”,“替身”),structField(“publish_date”,“字符串”),structField(“标题”,“字符串”))df< -read.df(“dbfs: / books.xml”,=“xml”,模式=customSchema,rowTag=“书”)#在这种情况下,“rootTag”设置为“行”和“rowTag”设置为“行”。write.df(df,“dbfs: / newbooks.xml”,“xml”,“覆盖”)

选项

支持缩短名称使用;您可以使用xml而不是com.databricks.spark.xml

XSD的支持

你可以验证个别行针对XSD模式使用rowValidationXSDPath

您使用该实用程序com.databricks.spark.xml.util.XSDToSchema提取一个火花DataFrame模式一些XSD文件。它只支持简单的、复杂的和序列类型,只有基本的XSD功能,是实验。

进口com火花xml跑龙套XSDToSchema进口javanio文件路径瓦尔模式=XSDToSchema(路径得到(“/道路/ / your.xsd”))瓦尔df=火花模式(模式)....xml(…)

嵌套的XML解析

尽管主要用于将XML文件转换为DataFrame,您还可以使用from_xml方法来解析XML的string值列在现有DataFrame并添加一个新列与解析结果的结构:

进口com火花xml功能from_xml进口com火花xmlschema_of_xml进口火花值得一提的_瓦尔df=/ / / DataFrame XML列“有效载荷”瓦尔payloadSchema=schema_of_xml(df选择(“有效载荷”)。作为(字符串])瓦尔解析=dfwithColumn(“解析”,from_xml(美元“有效载荷”,payloadSchema))

请注意

  • 模式:

    • 如果设置为宽容的默认的,而不是默认解析模式DROPMALFORMED。如果包含一个列的模式from_xml相匹配的columnNameOfCorruptRecord,然后宽容的模式输出列在结果结构畸形的记录。

    • 如果设置为DROPMALFORMEDXML值,不正确地解析导致值的列。没有行了。

  • from_xml将字符串数组包含XML解析结构体的数组。使用schema_of_xml_array代替。

  • from_xml_string是另一种用于udf,直接作用于一个字符串,而不是列。

转换规则

由于DataFrames和XML之间结构上的差异,还有一些从XML数据转换规则从DataFrame DataFrame和XML数据。你可以禁用处理属性的选择excludeAttribute

将XML转换成DataFrame

  • 属性:属性转换为字段中指定的前缀attributePrefix选择。如果attributePrefix_,文档

    <一个myOneAttrib =“AAAA”>< 2 >两个< /两个><三>三个三> < /一> < /

    生产模式:

    |——_myOneAttrib:字符串(可以为空=真正的)|——两个:字符串(可以为空=真正的)|——三个:字符串(可以为空=真正的)
  • 如果一个元素有属性,但没有子元素,属性值放在一个单独的字段中指定valueTag选择。如果valueTag_VALUE,文档

    <一><两myTwoAttrib =“BBBBB”>两个< /两个><三>三个三> < /一> < /

    生产模式:

    |——两个:结构体(可以为空=真正的)||——_VALUE:字符串(可以为空=真正的)||——_myTwoAttrib:字符串(可以为空=真正的)|——三个:字符串(可以为空=真正的)

DataFrame转换为XML

编写一个XML文件从DataFrame字段ArrayType与它的元素ArrayType会有额外的嵌套元素的领域。这不会发生在XML数据阅读和写作,但写DataFrame阅读从其他来源。因此,往返在读写XML文件具有相同的结构,但写DataFrame阅读从其他来源可能有不同的结构。

一个DataFrame模式:

|——一个:数组(可以为空=真正的)||——元素:数组(containsNull=真正的)|||——元素:字符串(containsNull=真正的)

和数据:

+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +|一个|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +|(WrappedArray(aa),WrappedArray(bb)]|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

生成的XML文件:

<一><项目>aa< /商品>< / ><一><项目>bb< /商品>< / >