XML文件

本文描述如何將XML文件作為Apache Spark數據源讀取和寫入。

需求

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

    • Databricks RuntimeX及以上: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”瓦爾selectedDatadf選擇“作者”“_id”selectedData選項“rootTag”“書”選項“rowTag”“書”xml“dbfs: / newbooks.xml”//指定模式進口orgapache火花sql類型.{StructTypeStructFieldStringType倍增式瓦爾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”模式customSchemarowTag“書”#在本例中,' 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中直接操作字符串而不是列的一種替代方法。

轉換規則

由於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真正的

和數據:

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

生成XML文件:

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