我想为在 MS Azure Synapse 中存储为 varchar(max) 的匹配标签提取 XML 值
I want to extract a XML value for a matching tag stored as varchar(max) in MS Azure Synapse
我是新手 Azure 之前使用 SAS,现在我们正在转向 azure synapse
在当前环境中
我想提取存储在列 C (varcharmax) 中的 XML 标记值作为变量。
[数据集][1]
[1]: https://i.stack.imgur.com/tbSIF.png
下面XML保存在C列(PKDATA)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:DataSet xmlns:ns2="http://www.test.com/t/cn/el">
<EnumObject>
<name>Inpatient</name>
<value>262784067</value>
<radiobutton>false</radiobutton>
</EnumObject>
<StringObject>
<name>xxx</name>
<prompt></prompt>
<value>/widget.jsp</value>
<width>99</width>
</StringObject>
</ns2:DataSet>
如果姓名为 Inpatient,则 262784067 为 Inpatient 类型
输出
|一个 |乙 |住院类型 |
| 11212 | 2587140 | 262784067 |
我用了下面的代码
selecta,b,
pkdata.value('/EnumObject/name') 作为住院类型
来自 dbo.extdata
我收到以下错误
找不到列“pkkddata”或用户定义的函数或聚合“pkdata.value”,或者名称不明确。
我尝试使用以下查询,但出现错误消息 104220,级别 16,状态 1,第 26 行找不到数据类型 'xml'。 SELECT a,b,(pkdata).value('(/EnumObject/name/text())[1]', 'varchar(100)') FROM [dbo].extdata 交叉应用 (SELECT CAST(pkdata AS xml)) AS x(pkdata)
当我使用下面的代码时出现以下错误 XMLDT 方法 'nodes' 只能在 xml 类型的列上调用。我尝试使用以下内容,但从 [dbo].[EXTDATA] rt cross join xmltable( '/EnumObject/name' passing xmltype(rt.pkdata) columns name number path 'name/@value' ) x
不确定如何进行
Azure SQL 版本
Microsoft Azure SQL 数据仓库 - 10.0.16003.0 2021 年 4 月 28 日 04:55:16 版权所有 (c) Microsoft Corporation
Azure Synapse Analytics,特别是专用 SQL 池不支持 XML 数据类型或任何伴随它的函数,包括 FOR XML
、.nodes
、.value
、.query
、.modify
等
如果您需要这种类型的处理,您可以使用传统的 SQL Server,例如 SQL Server 2019 或 Azure SQL DB。一种选择是使用 Synapse Pipelines 将数据移动到那里。作为替代方案,您可以考虑使用 Synapse Notebooks 和一些自定义 Python / Scala / c# 代码,但我只对此做了一个简单的测试。
Scala 中的简单示例:
单元格 1
// Get the table with the XML column from the database and expose as temp view
val df = spark.read.synapsesql("yourPool.dbo.someXMLTable")
df.createOrReplaceTempView("someXMLTable")
单元格 2
%%sql
-- Use SparkSQL to interrogate the XML
-- https://spark.apache.org/docs/2.3.0/api/sql/index.html#xpath
SELECT
colA,
colB,
xpath_string(pkData,'/DataSet/EnumObject[name="Inpatient"]/value') xvalue
FROM someXMLTable
单元格 3
val df2 = spark.sql("""
SELECT
colA,
colB,
xpath_string(pkData,'/DataSet/EnumObject[name="Inpatient"]/value') xvalue
FROM someXMLTable
""")
df2.show
单元格 4
// Write that dataframe back to the dedicated SQL pool
df2.write.synapsesql("yourPool.dbo.someXMLTable_processed", Constants.INTERNAL)
示例笔记本的屏幕截图:
XML 现在有点过时了——你有没有想过改用 JSON?此外,如果您的数据量不是那么大,那么只使用 Azure SQL DB 而不是 Synapse 会便宜很多。
我是新手 Azure 之前使用 SAS,现在我们正在转向 azure synapse 在当前环境中 我想提取存储在列 C (varcharmax) 中的 XML 标记值作为变量。 [数据集][1] [1]: https://i.stack.imgur.com/tbSIF.png 下面XML保存在C列(PKDATA)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:DataSet xmlns:ns2="http://www.test.com/t/cn/el">
<EnumObject>
<name>Inpatient</name>
<value>262784067</value>
<radiobutton>false</radiobutton>
</EnumObject>
<StringObject>
<name>xxx</name>
<prompt></prompt>
<value>/widget.jsp</value>
<width>99</width>
</StringObject>
</ns2:DataSet>
如果姓名为 Inpatient,则 262784067 为 Inpatient 类型
输出
|一个 |乙 |住院类型 | | 11212 | 2587140 | 262784067 |
我用了下面的代码 selecta,b, pkdata.value('/EnumObject/name') 作为住院类型 来自 dbo.extdata
我收到以下错误 找不到列“pkkddata”或用户定义的函数或聚合“pkdata.value”,或者名称不明确。
我尝试使用以下查询,但出现错误消息 104220,级别 16,状态 1,第 26 行找不到数据类型 'xml'。 SELECT a,b,(pkdata).value('(/EnumObject/name/text())[1]', 'varchar(100)') FROM [dbo].extdata 交叉应用 (SELECT CAST(pkdata AS xml)) AS x(pkdata)
当我使用下面的代码时出现以下错误 XMLDT 方法 'nodes' 只能在 xml 类型的列上调用。我尝试使用以下内容,但从 [dbo].[EXTDATA] rt cross join xmltable( '/EnumObject/name' passing xmltype(rt.pkdata) columns name number path 'name/@value' ) x
不确定如何进行
Azure SQL 版本 Microsoft Azure SQL 数据仓库 - 10.0.16003.0 2021 年 4 月 28 日 04:55:16 版权所有 (c) Microsoft Corporation
Azure Synapse Analytics,特别是专用 SQL 池不支持 XML 数据类型或任何伴随它的函数,包括 FOR XML
、.nodes
、.value
、.query
、.modify
等
如果您需要这种类型的处理,您可以使用传统的 SQL Server,例如 SQL Server 2019 或 Azure SQL DB。一种选择是使用 Synapse Pipelines 将数据移动到那里。作为替代方案,您可以考虑使用 Synapse Notebooks 和一些自定义 Python / Scala / c# 代码,但我只对此做了一个简单的测试。
Scala 中的简单示例:
单元格 1
// Get the table with the XML column from the database and expose as temp view
val df = spark.read.synapsesql("yourPool.dbo.someXMLTable")
df.createOrReplaceTempView("someXMLTable")
单元格 2
%%sql
-- Use SparkSQL to interrogate the XML
-- https://spark.apache.org/docs/2.3.0/api/sql/index.html#xpath
SELECT
colA,
colB,
xpath_string(pkData,'/DataSet/EnumObject[name="Inpatient"]/value') xvalue
FROM someXMLTable
单元格 3
val df2 = spark.sql("""
SELECT
colA,
colB,
xpath_string(pkData,'/DataSet/EnumObject[name="Inpatient"]/value') xvalue
FROM someXMLTable
""")
df2.show
单元格 4
// Write that dataframe back to the dedicated SQL pool
df2.write.synapsesql("yourPool.dbo.someXMLTable_processed", Constants.INTERNAL)
示例笔记本的屏幕截图:
XML 现在有点过时了——你有没有想过改用 JSON?此外,如果您的数据量不是那么大,那么只使用 Azure SQL DB 而不是 Synapse 会便宜很多。