如何在不使用 Spark 的情况下从 Synapse Notebook 中的 Azure Data Lake 读取 XML 文件

How To Read XML File from Azure Data Lake In Synapse Notebook without Using Spark

我有一个 XML 文件存储在 Azure Data Lake 中,我需要从 Synapse 笔记本中读取该文件。但是当我使用 spark-xml 库阅读这篇文章时,我得到了这个错误:

org.apache.spark.sql.AnalysisException: Found duplicate column(s) in the data schema: `d:col`

示例 xml 如下所示:

<m:properties>
            <d:FileSystemObjectType m:type="Edm.Int32">0</d:FileSystemObjectType>
            <d:Id m:type="Edm.Int32">10</d:Id>
            <d:Modified m:type="Edm.DateTime">2021-03-25T15:35:17Z</d:Modified>
            <d:Created m:type="Edm.DateTime">2021-03-25T15:35:17Z</d:Created>
            <d:ID m:type="Edm.Int32">10</d:ID>
            <d:Title m:null="true" />
            <d:Description m:type="Edm.String">Test</d:Description>
            <d:PurposeCode m:type="Edm.Int32">1</d:PurposeCode>
</m:properties>

请注意,d:Id 和 d:ID 的标签会导致重复错误。 发现此文档指出尽管它们的大小写不同,但它们被认为是重复的:https://docs.microsoft.com/en-us/azure/databricks/kb/sql/dupe-column-in-metadata 但是我无法修改 xml 并且必须按原样阅读。是否有变通办法让我仍然可以阅读 xml?

或者,有没有办法不使用 spark 来读取 xml?我正在考虑使用 scala.xml.XML 库读取 xml 文件来加载文件并解析文件。但是当我尝试这样做时,出现错误:

abfss:/<container>@<adls>.dfs.core.windows.net/<directory>/<xml_file>.xml (No such file or directory)

下面的代码片段:

import scala.xml.XML
val xml = XML.loadFile("abfss://<container>@<adls>.dfs.core.windows.net/<directory>/<xml_file>.xml")

注意:错误实际上只显示 abfss:/ 而不是参数上的路径 //

谢谢。

找到了一种将 spark 设置为区分大小写的方法,现在能够成功读取 xml:

spark.conf.set("spark.sql.caseSensitive", "true")