我有一堆xml文件,它们通过嵌套标记定义树层次结构(id:s之间的关系)。我想使用snowflake的sql语法将其解析为表格格式,用于半结构化数据。对于具有已知结构的xml文件,我知道如何进行。但是对于这些树,解析时结构是未知的,在这种情况下我不知道如何解决它。重复的通用模式是
<Nodes>
<Node>
...
</Node>
</Nodes>
参见下面的示例数据和所需输出。
有没有一种方法可以使用snowflake的sql语法来实现这一点?
示例数据:
<Nodes>
<Node Id="1">
<Nodes>
<Node Id="2">
</Node>
<Node Id="3">
<Nodes>
<Node Id="4">
</Node>
<Node Id="5">
<Nodes>
<Node Id="6">
</Node>
</Nodes>
</Node>
<Node Id="7">
</Node>
</Nodes>
</Node>
<Node Id="8">
</Node>
</Nodes>
</Node>
<Node Id="9">
<Nodes>
<Node Id="10">
</Node>
</Nodes>
</Node>
</Nodes>
所需的表格输出为:
|-----------|---------|
| parent_id | node_id |
|-----------|---------|
| null | 1 |
| 1 | 2 |
| 1 | 3 |
| 3 | 4 |
| 3 | 5 |
| 5 | 6 |
| 3 | 7 |
| 1 | 8 |
| null | 9 |
| 9 | 10 |
|-----------|---------|
1条答案
按热度按时间r7knjye21#
因此,这里要使用的flatten属性是recursive:
给予:
现在,您可以通过查找路径的所有匹配项并进行最长匹配来重建层次结构。
或
可以执行双重嵌套循环,如:
但它不会给出第一行,而且雪花在展开节点时的行为也不同
和
这意味着你必须试着处理这两个问题,这真的很恶心。
编辑:
因此,您可以更进一步,但请注意,如果发生第二个子情况,您可以获得节点名称
get(f2.value, '@') = 'Node'
这样我们就有了一些东西IFF
在第一种情况下value
平坦的部分是'Node'
因此,我们可以硬代码获取父->节点->节点,因此:给你:
只是缺少了
NULL, 1
以及NULL, 9
你想要的排。编辑2
所以回到我最初的建议,拉出节点id和路径,然后在节点上执行左连接以保持最长的匹配可以这样做,并给出所需的输出:
给予: