XML文件
本文描述如何將XML文件作為Apache Spark數據源讀取和寫入。
需求
創建
spark-xml
圖書館作為Maven庫.對於Maven坐標,指定:Databricks RuntimeX及以上:
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 '被設置為“ROWS”,' rowTag '被設置為“ROW”。write.df(df,“dbfs: / newbooks.xml”,“xml”,“覆蓋”)
選項
讀
路徑
: XML文件的位置。接受標準Hadoop通配符表達式。rowTag
:作為行處理的行標記。例如,在這個XML中<書> <書> <書>…< / >的書
,則值為書
.默認是行
.samplingRatio
:模式推斷的抽樣比(0.0 ~ 1),默認為1。可能的類型有StructType
,ArrayType
,StringType
,LongType
,倍增式
,BooleanType
,TimestampType
而且NullType
,除非您提供模式。excludeAttribute
:是否排除元素中的屬性。默認為false。nullValue
:作為值處理的值零
價值。默認是""
.模式
:處理損壞記錄的模式。默認是寬容的
.寬容的
:當它遇到損壞的記錄時,將所有字段設置為
零
並將格式錯誤的字符串放入配置的新字段columnNameOfCorruptRecord
.當它遇到錯誤數據類型的字段時,將有問題的字段設置為
零
.
DROPMALFORMED
:忽略損壞的記錄。FAILFAST
:當檢測到損壞的記錄時拋出異常。
inferSchema
:如果真正的
,嚐試為每個結果DataFrame列推斷適當的類型,如布爾型、數字型或日期型。如果假
,所有產生的列都是字符串類型。默認是真正的
.columnNameOfCorruptRecord
:存儲畸形字符串的新字段名。默認是_corrupt_record
.attributePrefix
:屬性的前綴,用於區分屬性和元素。這是字段名的前綴。默認是_
.valueTag
:當元素中有屬性而沒有子元素時,用於值的標記。默認是_VALUE
.字符集
:默認為utf - 8
但可以設置為其他有效的字符集名稱。ignoreSurroundingSpaces
:是否應該跳過圍繞值的空格。默認為false。rowValidationXSDPath
:用於驗證每一行的XML的XSD文件的路徑。驗證失敗的行如上所述被當作解析錯誤處理。XSD不會影響所提供或推斷的模式。如果相同的本地路徑在集群中的執行器上還不可見,那麼XSD和它所依賴的任何其他路徑都應該添加到Spark執行器中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
從中提取Spark DataFrame模式一些XSD文件。它隻支持簡單、複雜和序列類型,隻支持基本的XSD功能,而且是實驗性的。
進口com.磚.火花.xml.跑龍套.XSDToSchema進口java.nio.文件.路徑瓦爾模式=XSDToSchema.讀(路徑.得到(“/道路/ / your.xsd”))瓦爾df=火花.讀.模式(模式)…xml(...)
解析嵌套XML
雖然主要用於將XML文件轉換為DataFrame,但也可以使用from_xml
方法來解析現有DataFrame中字符串值的列中的XML,並將其添加為一個具有解析結果的新列,作為一個結構體:
進口com.磚.火花.xml.功能.from_xml進口com.磚.火花.xml.schema_of_xml進口火花.值得一提的._瓦爾df=.../// DataFrame包含列'payload'中的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中直接操作字符串而不是列的一種替代方法。
轉換規則
由於DataFrame和XML之間的結構差異,存在一些從XML數據到DataFrame以及從DataFrame到XML數據的轉換規則。您可以使用該選項禁用處理屬性excludeAttribute
.
轉換XML到DataFrame
屬性:屬性轉換為具有
attributePrefix
選擇。如果attributePrefix
是_
,文件<一個myOneAttrib =“AAAA”>< 2 >兩個兩個> < /<三>三個三> < /一> < /
生成模式:
根|--_myOneAttrib:字符串(可以為空=真正的)|--兩個:字符串(可以為空=真正的)|--三個:字符串(可以為空=真正的)
方法中指定的單獨字段中,如果元素具有屬性但沒有子元素,則屬性值將放在
valueTag
選擇。如果valueTag
是_VALUE
,文件<一><兩myTwoAttrib =“BBBBB”>兩個兩個> < /<三>三個三> < /一> < /
生成模式:
根|--兩個:結構體(可以為空=真正的)||--_VALUE:字符串(可以為空=真正的)||--_myTwoAttrib:字符串(可以為空=真正的)|--三個:字符串(可以為空=真正的)
將數據幀轉換為XML
從具有字段的DataFrame寫入XML文件ArrayType
其元素為ArrayType
將有一個額外的元素嵌套字段。這不會發生在讀取和寫入XML數據時,而是在寫入從其他源讀取的DataFrame時發生。因此,讀取和寫入XML文件的往返具有相同的結構,但寫入從其他源讀取的DataFrame可能具有不同的結構。
帶有模式的數據幀:
|--一個:數組(可以為空=真正的)||--元素:數組(containsNull=真正的)|||--元素:字符串(containsNull=真正的)
和數據:
+------------------------------------+|一個|+------------------------------------+|[WrappedArray(aa),WrappedArray(bb)]|+------------------------------------+
生成XML文件:
<一><項目>aa> < /項目< / ><一><項目>bb> < /項目< / >