XML文件

本文描述如何將XML文件作為Apache Spark數據源進行讀寫。

需求

  1. 創建spark-xml圖書館作為一個Maven庫.對於Maven坐標,指定:

    • 磚運行時7。x,上圖: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_//添加datafframe .read.xml()方法瓦爾df火花選項“rowTag”,“書”xml“dbfs: / books.xml”瓦爾selectedDatadf選擇“作者”,“_id”selectedData選項“rootTag”,“書”選項“rowTag”,“書”xml“dbfs: / newbooks.xml”/ /指定模式進口orgapache火花sql類型.{StructType,StructField,StringType,倍增式}瓦爾customSchemaStructType數組StructField“_id”,StringType,可以為空真正的),StructField“作者”,StringType,可以為空真正的),StructField“描述”,StringType,可以為空真正的),StructField“類型”,StringType,可以為空真正的),StructField“價格”,倍增式,可以為空真正的),StructField“publish_date”,StringType,可以為空真正的),StructField“標題”,StringType,可以為空真正的)))瓦爾df火花選項“rowTag”,“書”模式customSchemaxml“books.xml”瓦爾selectedDatadf選擇“作者”,“_id”selectedData選項“rootTag”,“書”選項“rowTag”,“書”xml“dbfs: / newbooks.xml”
#推斷模式圖書館SparkRsparkR.session“地方[4]”,sparkPackagesc“com.databricks: spark-xml_2.12: <版本> "))df<-read.df“dbfs: / books.xml”,“xml”,rowTag“書”#默認的“rootTag”和“rowTag”write.dfdf,“dbfs: / newbooks.xml”,“xml”#指定模式customSchema<-structTypestructField“_id”,“字符串”),structField“作者”,“字符串”),structField“描述”,“字符串”),structField“類型”,“字符串”),structField“價格”,“替身”),structField“publish_date”,“字符串”),structField“標題”,“字符串”))df<-read.df“dbfs: / books.xml”,“xml”,模式customSchema,rowTag“書”在本例中,“rootTag”被設置為“ROWS”,“rowTag”被設置為“ROW”。write.dfdf,“dbfs: / newbooks.xml”,“xml”,“覆蓋”

選項

支持縮寫名的使用;您可以使用xml而不是com.databricks.spark.xml

XSD的支持

可以根據XSD模式使用rowValidationXSDPath

你使用實用工具com.databricks.spark.xml.util.XSDToSchema來提取一個Spark DataFrame模式一些XSD文件。它隻支持簡單、複雜和序列類型,隻支持基本的XSD功能,而且是實驗性的。

進口com火花xml跑龍套XSDToSchema進口javanio文件路徑瓦爾模式XSDToSchema路徑得到“/道路/ / your.xsd”))瓦爾df火花模式模式)…xml(…)

嵌套的XML解析

雖然主要用於將XML文件轉換為DataFrame,但也可以使用from_xml方法來解析現有DataFrame中字符串值列中的XML,並將其添加為具有解析結果的新列作為結構:

進口com火花xml功能from_xml進口com火花xmlschema_of_xml進口火花值得一提的_瓦爾df.../// DataFrame中'payload'列包含XML瓦爾payloadSchemaschema_of_xmldf選擇“有效載荷”).作為字符串])瓦爾解析dfwithColumn“解析”,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真正的

和數據:

+------------------------------------+|一個|+------------------------------------+|WrappedArrayaa),WrappedArraybb)]|+------------------------------------+

生成XML文件:

<一><項目>aa> < /項目< / ><一><項目>bb> < /項目< / >