XML文件
本文描述了如何读和写一个XML文件作为一个Apache火花数据源。
需求
创建
spark-xml
图书馆作为一个Maven库。对于Maven坐标,指定:com.databricks: spark-xml_2.12: <版本>
看到
spark-xml
释放< / >的最新版本<版本>
。安装库在一个集群中。
例子
本节中的示例使用了书< / >XML文件。
检索图书XML文件:
wget https://github.com/databricks/spark-xml/raw/master/src/test/resources/books.xml美元
上传文件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”)/ /指定模式进口org。apache。火花。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文件的位置。接受标准Hadoop globbing表达式。rowTag
:行标签治疗作为一个行。例如,在这个XML<书> <书> <书>…< /书>
,该值书
。默认是行
。samplingRatio
推断模式:抽样率(0.0 ~ 1)。默认值为1。可能的类型是StructType
,ArrayType
,StringType
,LongType
,倍增式
,BooleanType
,TimestampType
和NullType
,除非你提供一种模式。excludeAttribute
:是否排除属性元素。默认是假的。nullValue
:治疗价值零
价值。默认是”“
。模式
:处理腐败的方式记录。默认是宽容的
。宽容的
:当遇到一个损坏的记录,设置所有字段
零
畸形的字符串,并将配置一个新的领域columnNameOfCorruptRecord
。当遇到一个字段错误的数据类型,设置的字段
零
。
DROPMALFORMED
:忽略了损坏的记录。FAILFAST
当它检测到损坏的记录:抛出一个异常。
inferSchema
:如果真正的
,试图为每个生成的DataFrame推断出一个适当的类型列,像一个布尔值、数字或日期类型。如果假
,所有生成的字符串类型的列。默认是真正的
。columnNameOfCorruptRecord
:新领域,畸形的名字字符串存储。默认是_corrupt_record
。attributePrefix
:前缀,以便区分属性和元素。这是字段名称的前缀。默认是_
。valueTag
:标签用于一个元素中的属性值时,没有子元素。默认是_VALUE
。字符集
:默认为utf - 8
但可以设置为其他有效字符集名称。ignoreSurroundingSpaces
:周围空白值是否应该被忽略。默认是假的。rowValidationXSDPath
:道路一个XSD文件,用于验证XML为每一行。行,无法验证被当做解析的错误。XSD并不否则影响提供的模式或推断。如果相同的本地路径也没有可见的执行人集群,然后XSD和任何其他这取决于应该添加到火花执行人SparkContext.addFile< / >。在这种情况下,使用当地的XSD/ foo / bar.xsd
,叫addFile (“/ foo / bar.xsd”)
并通过“bar.xsd”
作为rowValidationXSDPath
。
写
路径
:位置写文件。rowTag
:行标签治疗作为一个行。例如,在这个XML<书> <书> <书>…< /书>
,该值书
。默认是行
。rootTag
治疗作为根:根标记。例如,在这个XML<书> <书> <书>…< /书>
,该值书
。默认是行
。nullValue
:写的价值零
价值。默认值是字符串“零”
。当“零”
,它不为字段写属性和元素。attributePrefix
:前缀的属性来区分属性和元素。这是字段名称的前缀。默认是_
。valueTag
:标签用于一个元素中的属性值时,没有子元素。默认是_VALUE
。压缩
:压缩编解码器使用在保存文件。应该是类的完全限定名称实现吗org.apache.hadoop.io.compress.CompressionCodec
或一个不区分大小写的短名称(bzip2
,gzip
,lz4
,时髦的
)。默认是没有压缩。
支持缩短名称使用;您可以使用xml
而不是com.databricks.spark.xml
。
XSD的支持
你可以验证个别行针对XSD模式使用rowValidationXSDPath
。
您使用该实用程序com.databricks.spark.xml.util.XSDToSchema
提取一个火花DataFrame模式一些XSD文件。它只支持简单的、复杂的和序列类型,只有基本的XSD功能,是实验。
进口com。砖。火花。xml。跑龙套。XSDToSchema进口java。nio。文件。路径瓦尔模式=XSDToSchema。读(路径。得到(“/道路/ / your.xsd”))瓦尔df=火花。读。模式(模式)....xml(…)
嵌套的XML解析
尽管主要用于将XML文件转换为DataFrame,您还可以使用from_xml
方法来解析XML的string值列在现有DataFrame并添加一个新列与解析结果的结构:
进口com。砖。火花。xml。功能。from_xml进口com。砖。火花。xml。schema_of_xml进口火花。值得一提的。_瓦尔df=…/ / / DataFrame XML列“有效载荷”瓦尔payloadSchema=schema_of_xml(df。选择(“有效载荷”)。作为(字符串])瓦尔解析=df。withColumn(“解析”,from_xml(美元“有效载荷”,payloadSchema))
请注意
模式
:如果设置为
宽容的
默认的,而不是默认解析模式DROPMALFORMED
。如果包含一个列的模式from_xml
相匹配的columnNameOfCorruptRecord
,然后宽容的
模式输出列在结果结构畸形的记录。如果设置为
DROPMALFORMED
XML值,不正确地解析导致零
值的列。没有行了。
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< /商品>< / >