【问题标题】:How to retrieve all child nodes from JSON file如何从 JSON 文件中检索所有子节点
【发布时间】:2020-10-27 05:05:35
【问题描述】:

我有以下 JSON 文件,它处于外部阶段,我正在尝试使用以下查询将复制查询写入表中。但它从节点“值”中获取一条记录,而我需要为值节点插入所有子元素。我已将此文件加载到具有变体数据类型的表中。 我正在使用的查询:

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; 
{
    "batchId": "",
    "results": [
        {
            "pageInfo": {
                "numberOfPages": ,
                "pageNumber": ,
                "pageSize": 
            },
            "requestId": "",
            "showPopup": false,
            "values": [
                [
                    {
                        "columnId": ,
                        "value": ""
                    },
                    
                    {
                        "columnId": ,
                        "value": 
                    }
                ]
            ]
        }
    ]
}

【问题讨论】:

  • 这个回答你的问题吗:stackoverflow.com/questions/32065604/…
  • 我正在尝试将数据从外部阶段加载到雪花表。我已经将文件加载到 JSON 格式的名为 Lease 的表中。现在我正在尝试将其以结构化和表格格式放入另一个表中
  • 能否提供您希望在输出中看到的表结构和示例数据?谢谢
  • 所需输出:BATCHID,NOOFPAGES,PAGENO,PGSZ,REQUESTID,SHOWPOPUP,COlMID,VAL a,1,1,100000,a,FALSE,4567,2020-10-09T07:24:29.000Z

标签: snowflake-cloud-data-platform snowflake-schema


【解决方案1】:

您需要使用 LATERAL FLATTEN 函数,如下所示:

我创建了这张表:

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 的专家,但基本上 LATERAL 是一种连接和 FLATTEN,正如它所说,扁平化数据,即从单行生成多行。因此,您正在将单行数据与 FLATTEN 函数生成的多行数据进行笛卡尔连接。基本语法是输入需要引用 JSON 中具有要展平的多个子节点的节点。此链接可能会有所帮助:community.snowflake.com/s/article/How-To-Lateral-Join-Tutorial.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
相关资源
最近更新 更多