无法从Clickhouse中的嵌套Json插入数据

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

我有一些json文件,我保存在s3中,结构是这样的

{
  "testing_field": "tambahan",
  "test_update_2": {
    "code_1": "5B72F80DA8",
    "path_2": "xxx",
    "filename_2": "xxx.pdf",
    "qrcode_2": "xxx"
  }
}

我先尝试了select功能来测试数据检索,像这样,

SELECT
test_update_2.filename_2
FROM s3(
    'xxxx/sample_update_field.json',
    'xxx',
    'xxx'
)

我可以得到结果,像这样,

xxx.pdf
xxx.pdf

之后,我在表中创建一个新字段,因为我搜索并获取了此注释

不能通过直接在列名中添加点(.)来更改列名,因为ClickHouse使用点(.)作为数据库和表名之间的分隔符。因此,在列名中使用点会与现有语法发生冲突。

我将列名称设为如下

Executing query: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS testing_field Nullable(String);
Executing query: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_code_1 Nullable(String);
Executing query: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_filename_2 Nullable(String);
Executing query: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_path_2 Nullable(String);
Executing query: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_qrcode_2 Nullable(String);

我将 (.) 替换为 (_)

但是当我尝试使用此查询插入时

INSERT INTO example_db.sidebar_staging (test_update_2_filename_2)
SELECT
test_update_2.filename_2
FROM s3(
    'xxx/sample_update_field.json',
    'xxx'
    'xxx'
)

数据未输入目标字段,

然后我必须添加别名,然后我尝试这个查询,

INSERT INTO example_db.sidebar_staging (test_update_2_filename_2)
    SELECT
    test_update_2.filename_2 as test_update_2_filename_2
    FROM s3(
        'xxx/sample_update_field.json',
        'xxx'
        'xxx'
    )

但是结果是一样的,我想我必须测试

testing_field 
,因为它不是嵌套的json,用这个代码

INSERT INTO example_db.sidebar_staging (testing_field)
SELECT
testing_field
FROM s3(
    'xxx/sample_update_field.json',
    'xxx',
    'xxx'
)

令人惊讶的是,当JSON中的字段名与表中的字段名相同时,不需要别名,就可以插入到目标表中。

因为

testing_field
在列表中是相同的
testing_field 

所以问题是,如果原始字段位于嵌套 JSON 中,如何进行插入? 我必须用点格式提取(

test update_2.filename 2
)才能获得值, 在另一边,我不能在名称列中使用点,也不能使用别名来映射到列

json database insert clickhouse
1个回答
0
投票

您是否尝试过使用

JSONExtract
方法(链接到文档)?你应该能够通过这样的事情来实现你想要的:

INSERT INTO example_db.sidebar_staging (test_update_2_filename_2)
SELECT
    JSONExtract(test_update_2, 'filename_2', 'String') AS test_update_2_filename_2
FROM s3(
    'xxx/sample_update_field.json',
    'xxx',
    'xxx'
)
© www.soinside.com 2019 - 2024. All rights reserved.