Snowflake cloud data platform 如何从JSON文件中检索所有子节点

Snowflake cloud data platform 如何从JSON文件中检索所有子节点,snowflake-cloud-data-platform,snowflake-schema,Snowflake Cloud Data Platform,Snowflake Schema,我有下面的JSON文件,它在外部阶段,我试图用下面的查询将一个复制查询写入表中。但是它从节点“values”获取一条记录,而我需要为values节点插入所有子元素。我已将此文件加载到一个带有variant数据类型的表中。 我正在使用的查询: select record:batchId batchId, record:results[0].pageInfo.numberOfPages NoofPages, record:results[0].pageInfo.pageNumber pageNo,

我有下面的JSON文件,它在外部阶段,我试图用下面的查询将一个复制查询写入表中。但是它从节点“values”获取一条记录,而我需要为values节点插入所有子元素。我已将此文件加载到一个带有variant数据类型的表中。 我正在使用的查询:

select record:batchId batchId, record:results[0].pageInfo.numberOfPages NoofPages, record:results[0].pageInfo.pageNumber pageNo,
record:results[0].pageInfo.pageSize PgSz, record:results[0].requestId requestId,record:results[0].showPopup showPopup,
record:results[0].values[0][0].columnId columnId,record:results[0].values[0][0].value val
from lease; 

您需要使用横向展平功能,如下所示:

我创建了这个表:

create table json_test (seq_no integer, json_text variant);
然后用这个JSON字符串填充它:

insert into json_test(seq_no, json_text)
select 1, parse_json($${
    "batchId": "a",
    "results": [
        {
            "pageInfo": {
                "numberOfPages": "1",
                "pageNumber": "1",
                "pageSize": "100000"
            },
            "requestId": "a",
            "showPopup": false,
            "values": [
                [
                    {
                        "columnId": "4567",
                        "value": "2020-10-09T07:24:29.000Z"
                    },
                    
                    {
                        "columnId": "4568",
                        "value": "2020-10-10T10:24:29.000Z"
                    }
                ]
            ]
        }
    ]
}$$);
然后执行以下查询:

select 
json_text:batchId batchId
,json_text:results[0].pageInfo.numberOfPages numberOfPages
,json_text:results[0].pageInfo.pageNumber pageNumber
,json_text:results[0].pageInfo.pageSize pageSize
,json_text:results[0].requestId requestId
,json_text:results[0].showPopup showPopup
,f.value:columnId columnId
,f.value:value value
from json_test t
,lateral flatten(input => t.json_text:results[0]:values[0]) f;
给出了这些结果——我认为这大致就是您想要的结果:

BATCHID    NUMBEROFPAGES    PAGENUMBER    PAGESIZE    REQUESTID    SHOWPOPUP    COLUMNID    VALUE
"a"        "1"              "1"           "100000"    "a"          false        "4567"      "2020-10-09T07:24:29.000Z"
"a"        "1"              "1"           "100000"    "a"          false        "4568"      "2020-10-10T10:24:29.000Z"

这是否回答了您的问题:我正在尝试将数据从外部阶段加载到雪花表。我已经以JSON格式将该文件加载到一个名为lease的表中。现在,我正试图将其转换为结构化和表格格式到另一个表格中。请您提供希望在输出中看到的表格结构和示例数据?感谢所需的输出:BATCHID、NOOFPAGES、PAGENO、PGSZ、REQUESTID、SHOWPOPUP、COlMID、VAL a、1,1100000、a、FALSE、4567200-10-09T07:24:29.000ZIt符合我的要求,请解释一下“表格展平和横向展平”的工作原理。我试着浏览雪花文档,但这并没有帮助我清楚地理解HI-如果你认为我的答案有帮助,请你勾选它好吗?我绝对不是查询JSON的专家,但基本上,横向是一种连接和展平的类型,正如它所说的,展平数据,即从一行生成多行。因此,您正在执行单行数据与扁平函数生成的多行数据的笛卡尔连接。基本语法是,输入需要引用JSON中的节点,该节点具有要展平的多个子节点。此链接可能有帮助:。
BATCHID    NUMBEROFPAGES    PAGENUMBER    PAGESIZE    REQUESTID    SHOWPOPUP    COLUMNID    VALUE
"a"        "1"              "1"           "100000"    "a"          false        "4567"      "2020-10-09T07:24:29.000Z"
"a"        "1"              "1"           "100000"    "a"          false        "4568"      "2020-10-10T10:24:29.000Z"