XML文件
本文描述如何將XML文件作為Apache Spark數據源進行讀寫。
需求
創建
spark-xml
圖書館作為一個Maven庫.對於Maven坐標,指定:磚運行時7。x,上圖:
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._//添加datafframe .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 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
:用於驗證每一行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中直接操作String而不是列的一種替代方法。
轉換規則
由於DataFrame和XML之間的結構差異,從XML數據到DataFrame以及從DataFrame到XML數據之間存在一些轉換規則。可以使用該選項禁用處理屬性excludeAttribute
.
轉換XML到DataFrame
屬性:屬性被轉換為具有在
attributePrefix
選擇。如果attributePrefix
是_
,文檔<一個myOneAttrib =“AAAA”>< 2 >兩個兩個> < /<三>三個三> < /一> < /
生產模式:
根|--_myOneAttrib:字符串(可以為空=真正的)|--兩個:字符串(可以為空=真正的)|--三個:字符串(可以為空=真正的)
如果元素有屬性但沒有子元素,則將屬性值放在中指定的單獨字段中
valueTag
選擇。如果valueTag
是_VALUE
,文檔<一><兩myTwoAttrib =“BBBBB”>兩個兩個> < /<三>三個三> < /一> < /
生產模式:
根|--兩個:結構體(可以為空=真正的)||--_VALUE:字符串(可以為空=真正的)||--_myTwoAttrib:字符串(可以為空=真正的)|--三個:字符串(可以為空=真正的)
轉換DataFrame到XML
從具有字段的DataFrame寫入XML文件ArrayType
元素為ArrayType
會為元素添加一個額外的嵌套字段。這在讀寫XML數據時不會發生,但在編寫從其他源讀取的DataFrame時才會發生。因此,讀寫XML文件的往返具有相同的結構,但編寫從其他源讀取的DataFrame可能具有不同的結構。
一個帶有模式的數據幀:
|--一個:數組(可以為空=真正的)||--元素:數組(containsNull=真正的)|||--元素:字符串(containsNull=真正的)
和數據:
+------------------------------------+|一個|+------------------------------------+|[WrappedArray(aa),WrappedArray(bb)]|+------------------------------------+
生成XML文件:
<一><項目>aa> < /項目< / ><一><項目>bb> < /項目< / >