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< /商品>< / >