尝试将嵌套 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}]} |
从 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} │
└────────────────────────┘