在雪花中提取 XML 数据
Posted
技术标签:
【中文标题】在雪花中提取 XML 数据【英文标题】:Extracting XML data in Snowflake 【发布时间】:2021-04-24 16:07:14 【问题描述】:我有一个表 TEST_XML,它有一个变体列 SRC_XML,其中包含以下 XML。当我尝试提取 QUESTION_TEXT 和 ANSWER_TEXT 时,结果为 NULL,即使 XML 在相应字段中有值
<DATA_EXPORT>
<HEADER>
<ENTRY_DATE>
<START>2021-04-02</START>
<END>2021-04-02</END>
</ENTRY_DATE>
<QUESTION_COUNT>225</QUESTION_COUNT>
<SURVEY_QUESTIONS>
<QUESTION>
<NUMBER>1</NUMBER>
<QUESTION_TEXT>DO YOU TRAVEL?</QUESTION_TEXT>
<ANSWER_TEXT>NO</ANSWER_TEXT>
</QUESTION>
<QUESTION>
<NUMBER>2</NUMBER>
<QUESTION_TEXT>HOW MANY LANGUAGES DO YOU SPEAK?</QUESTION_TEXT>
<ANSWER_TEXT>6</ANSWER_TEXT>
</QUESTION>
</SURVEY_QUESTIONS>
</HEADER>
</DATA_EXPORT>
我用于提取数据的查询 -
SELECT
XMLGET(D.VALUE, 'QUESTION') AS Q
, GET(XMLGET(Q, 'NUMBER'), '$') AS QUESTION_NUMBER
, GET(XMLGET(Q, 'QUESTION_TEXT'), '$') AS QUESTION
, GET(XMLGET(Q, 'ANSWER_TEXT'), '$') AS ANSWER
FROM TEST_XML,
LATERAL FLATTEN(GET(XMLGET(XMLGET(SRC_XML, 'HEADER', 0),'SURVEY_QUESTIONS'), '$'))D;
我期待的输出是
QUESTION_NUMBER | QUESTION | ANSWER |
---|---|---|
1 | DO YOU TRAVEL? | NO |
2 | HOW MANY LANGUAGUES DO YOU SPEAK? | 6 |
我应该在我的查询中进行哪些更改?请指教。
【问题讨论】:
@LukaszSzozda - 我仍然在所有行和列上获得 NULL 值。你能帮忙查询一下吗? 请道歉。我不明白它是如何工作的,尤其是 LATERAL join。 【参考方案1】:因此,将您的 SQL 放入 FLATTEN 并将它们分开,我们看到了
SELECT
XMLGET(SRC_XML, 'HEADER', 0) as h
,XMLGET(h,'SURVEY_QUESTIONS') as sq
,GET(sq, '$') as parts
,d.*
FROM TEST_XML,
LATERAL FLATTEN(GET(XMLGET(XMLGET(SRC_XML, 'HEADER', 0),'SURVEY_QUESTIONS'), '$'))D;
你的 h sq 和零件都是正确的。但是你称为q
的问题是实际的块,所以你不需要把它拆开。
因此你想要使用的是:
SELECT
GET(XMLGET(D.VALUE, 'NUMBER'), '$') AS QUESTION_NUMBER
, GET(XMLGET(D.VALUE, 'QUESTION_TEXT'), '$') AS QUESTION
, GET(XMLGET(D.VALUE, 'ANSWER_TEXT'), '$') AS ANSWER
FROM TEST_XML,
LATERAL FLATTEN(GET(XMLGET(XMLGET(SRC_XML, 'HEADER', 0),'SURVEY_QUESTIONS'), '$'))D;
给出:
QUESTION_NUMBER QUESTION ANSWER
1 "DO YOU TRAVEL?" "NO"
2 "HOW MANY LANGUAGES DO YOU SPEAK?" 6
【讨论】:
你太棒了!我期待您会提供帮助,并且您回答得很好。你的解决方案奏效了。非常感谢 :) 我知道 $ 获取特定标签的内容,@ 获取标签名称。 LATERAL FLATTEN 是如何工作的?我浏览了文档,但是当我遇到复杂的 XML 层次结构时,我感到很困惑。你能帮我理解吗? @vvazza FLATTEN 采用数组之类的东西,并使用“数组”中的子对象加上一些其他元值创建新的数据行,这可以根据您的任务为您提供帮助是做。因此,在您的数据中,您将遍历HEADER,SURVEY_QUESTIONS
,它将每个问题作为一行SQL 输出提供给您,因此您可以访问来自TEST_XML
的任何内容以及来自D
的当前项目的任何内容。基本上 FLATTEN 与 javascript 或 C# 中的FOREACH
相同
谢谢!我想我已经开始理解以及如何从您在这里对我的两个问题给出的答案中查看数据。如果我有任何问题会回复:) 再次感谢以上是关于在雪花中提取 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在雪花中使用 parse_xml 忽略损坏的 xml 行