我有一个包含以下数据的xml(已编辑)文件:
<dept dept_id="1" dept_name="Marketing">
<progress>1</progress>
<employee empname="a">
<end> 1 </end>
<address addr1="123 abc">
...
</address>
</employee>
</dept>
<dept dept_id="2" dept_name="Sales">
<progress>1</progress>
<employee empname="b">
<end> 1 </end>
<address addr1="456 cde">
...
</address>
</employee>
</dept>
我将这个文件放在awss3中,然后使用“copy into”将数据传输到variant列中snowflake中的一个外部表中。如下所示:
copy into DB.AWS_S3_STAGE_SCHEMA.test_XML_copy
from @AWS_S3_LANDING/websiteXML/Test_xml.xml
FILE_FORMAT = ( TYPE = XML STRIP_OUTER_ELEMENT = TRUE ) ;
现在,我可以从这个表中查询数据,并使用以下查询检索标签中的“marketing”和“sales”之类的数据(我从snowflake docs获得语法并使用它):
SELECT
GET(xmldata, '@dept_id')::integer as dept_id,
GET(xmldata, '@dept_name')::string as dept_name
FROM test_XML_copy;
但是,我无法查询子节点中标记内的数据。例如:我需要像“a”和“123 ”这样的数据。如果有人能在这个问题上帮助我,我将不胜感激。
2条答案
按热度按时间suzh9iv81#
结合使用
XMLGET
以及GET
函数来遍历xml文档中的嵌套对象。前者帮助获取当前标记下的整个标记对象,而后者允许查询当前标记中的属性和常规值。
这将产生:
您的示例数据显示子标记没有重复,但是如果它们确实重复(例如多个)
employee
在每个dept
)那么FLATTEN
可以先用来生产一个employee
每行和上述方法可以重新应用。或者,如果它是标记结构的固定形式,并且它们总是有序的,那么您可以在中使用示例号XMLGET
指向每个对象(隐式默认值为0,第一个对象)。将文档分解为每个员工和每个地址一行的示例内部标记:
(这将产生与上述类似的结果,例如op问题中提供的示例)
注意:还可以将路径语法用于
$
以及@
用于导航结构而不是嵌套函数的字符,但这些字符依赖于输入数据结构的严格顺序:zfciruhq2#
要从子节点提取数据,需要使用横向展平来转换数据,例如展平
<employee>
元素并获取emp_name
属性:本文提供了一些有关在snowflake中查询xml的非常有用的信息:https://community.snowflake.com/s/article/querying-nested-xml-in-snowflake