我有一些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
)才能获得值,
在另一边,我不能在名称列中使用点,也不能使用别名来映射到列
您是否尝试过使用
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'
)