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