如何将包含json记录数组的字符串列转换为DuckDB中的列表列?

ffscu2ro  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(306)

我目前正在使用DuckDB来执行数据转换,使用一个parquet文件作为源。在这个parquet文件中,我有一列编码为字符串,其中包含一个json记录数组:
[{...}, {...}, {...}]
我想操作这个record数组,就好像它是一个jsons的列表列。
我尝试使用duckDB标量函数阅读此列,但不幸的是,此列无法正确解析,并且我无法在标量函数中设置json_format,因为我可以使用read_json_objects函数。
我能做些什么来解决这个问题吗?*
下面是一个可重现的示例,其中包含输入表和输出表。

-- Build the table and populate it with a string 
-- column with an array of json records

CREATE TABLE input(data VARCHAR); 
INSERT INTO input VALUES ('[{"id": "1", "status":"ok"}, {"id":"2", "status":"ok"}]');

-- Build the output table and populate it with 
-- a json column with an list

CREATE TABLE output(data JSON);
INSERT INTO output (data) VALUES (ARRAY['{"id": "1", "status": "ok"}', '{"id": "2", "status": "ok"}']);
kupeojn6

kupeojn61#

您需要为您的用例使用DuckDB的一些文本函数。https://duckdb.org/docs/sql/functions/char
通常,您可以使用DuckDB的string_splitVARCHAR分隔为VARCHAR s(或在您的情况下为JSON s)的列表。在您的示例中,JSON中的逗号与分隔JSON s的逗号冲突。我的解决方案可能有点古怪,但我希望它对你有用。我去掉了最左边和最右边的括号,然后用}},替换},,以避免逗号分隔符的混淆,然后将VARCHAR拆分为一个JSON列表,并使用},作为分隔符。

duckdb> LOAD 'json';
duckdb> CREATE TABLE input(data VARCHAR);
duckdb> INSERT INTO input VALUES ('[{"id": "1", "status":"ok"}, {"id":"2", "status":"ok"}]');
duckdb> CREATE TABLE output_as_json_list(data JSON[]);
duckdb> CREATE TABLE output_as_json(data JSON);

duckdb> INSERT INTO output_as_json_list SELECT string_split(replace(data[2:-1], '},', '}},'), '},') FROM input;
duckdb> SELECT * FROM output_as_json_list;
┌──────────────────────────────────────────────────────────┐
│ data                                                     │
╞══════════════════════════════════════════════════════════╡
│ [{"id": "1", "status":"ok"},  {"id":"2", "status":"ok"}] │
└──────────────────────────────────────────────────────────┘

duckdb> INSERT INTO output_as_json SELECT UNNEST(data) FROM output_as_json_list;
duckdb> SELECT * FROM output_as_json;
┌────────────────────────────┐
│ data                       │
╞════════════════════════════╡
│ {"id": "1", "status":"ok"} │
│  {"id":"2", "status":"ok"} │
└────────────────────────────┘

相关问题