加载嵌套 JSON

问题描述 投票:0回答:1

尝试将嵌套 JSON 文件加载到 Duckdb 中。
这是 JSON 内容:

{
   "MainLevel":[
      {
         "More":{
         }
      },
      {
         "More":{
            "Level2":[
               {
                  "Field1":"A"
               }
            ]
         }
      }
   ]
}

这是我用来加载的 Duckdb SQL 脚本:

CREATE TABLE duckdbtest1.main.nested_JSON AS
SELECT 
    Level2.Field1,
FROM 
    (SELECT unnest(MainLevel) as MainLevel
     FROM read_JSON_auto('C:\\jsonfiles\\*.json', maximum_object_size = 999999999))
     as MainLevel,
    unnest(MainLevel.More.Level2) as Level2;

我得到的错误是:

SQL 错误:java.sql.SQLException:Binder 错误:表“Level2”没有名为“Field1”的列
第 3 行:Level2.Field1,

我过去也做过类似的事情,没有任何问题。

我唯一能想到的是第一个“More”没有“Level2”。

这会引起问题吗?如何让它发挥作用的想法?

尝试过各种取消嵌套和左连接的组合,但没有成功。

这是我的反复试验(我显然不知道我在做什么):

1)

SELECT 
    *
FROM 
    (SELECT unnest(MainLevel) as MainLevel
     FROM read_JSON_auto('C:\\jsonfiles\\*.json', maximum_object_size = 999999999))
     as MainLevel,
    unnest(MainLevel.More.Level2) as Level2;

给予:

主关 解除嵌套
{更多={Level2=[{Field1=A}]}} {字段1=A}

2)

SELECT 
    Mainlevel
FROM 
    (SELECT unnest(MainLevel) as MainLevel
     FROM read_JSON_auto('C:\\jsonfiles\\*.json', maximum_object_size = 999999999))
     as MainLevel,
    unnest(MainLevel.More.Level2) as Level2;

给予:

主关
{更多={Level2=[{Field1=A}]}}

3)

SELECT 
    Mainlevel
FROM 
    (SELECT unnest(MainLevel) as MainLevel
     FROM read_JSON_auto('C:\\jsonfiles\\*.json', maximum_object_size = 999999999))
     as MainLevel;
 

给予:

主关
{更多={Level2=null}}
{更多={Level2=[{Field1=A}]}}

4)

SELECT 
    Mainlevel
FROM 
    (SELECT unnest(MainLevel, recursive := true) as MainLevel
     FROM read_JSON_auto('C:\\jsonfiles\\*.json', maximum_object_size = 999999999))
     as MainLevel;
 

给予:

主关
{级别2=空}
{级别2=[{字段1=A}]}
sql json duckdb
1个回答
0
投票

从 DuckDB 1.1.0 开始,行为似乎发生了变化

duckdb.sql("""
from (
   from values ([{'More': {'Level2': [{'Field1': 'A'}]}}]) as tbl(MainLevel)
   select unnest(MainLevel) as MainLevel
), unnest(MainLevel.More.Level2) as FOOBAR
""")                           # ^^^^^^^^^ this was always "ignored" in all versions

以前,取消嵌套似乎是从路径中的最终标识符继承名称。

DuckDB 1.0.0

┌──────────────────────────────────────────────────────┬────────────────────────┐
│                      MainLevel                       │         Level2         │
│ struct(more struct(level2 struct(field1 varchar)[])) │ struct(field1 varchar) │
├──────────────────────────────────────────────────────┼────────────────────────┤
│ {'More': {'Level2': [{'Field1': A}]}}                │ {'Field1': A}          │
└──────────────────────────────────────────────────────┴────────────────────────┘

这让你的

as Level2
看起来好像在做某事,但实际上是 “无操作”

DuckDB 1.1.0

┌──────────────────────────────────────────────────────┬────────────────────────┐
│                      MainLevel                       │         unnest         │
│ struct(more struct(level2 struct(field1 varchar)[])) │ struct(field1 varchar) │
├──────────────────────────────────────────────────────┼────────────────────────┤
│ {'More': {'Level2': [{'Field1': A}]}}                │ {'Field1': A}          │
└──────────────────────────────────────────────────────┴────────────────────────┘

我不确定这是否是有意更改。

至于您的查询结构:

from (subquery), unnest()

这对我来说是

from (subquery) select ...
,在这种情况下
as ...
适用。

duckdb.sql("""
from (
   from values ([{'More': {'Level2': [{'Field1': 'A'}]}}]) as tbl(MainLevel)
   select unnest(MainLevel) as MainLevel
)
select unnest(MainLevel.More.Level2) as FOOBAR
""")
┌────────────────────────┐
│         FOOBAR         │
│ struct(field1 varchar) │
├────────────────────────┤
│ {'Field1': A}          │
└────────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.