在 Redshift 中复制 JSON 列

Posted

技术标签:

【中文标题】在 Redshift 中复制 JSON 列【英文标题】:Copy JSON column in Redshift 【发布时间】:2015-08-19 14:58:19 【问题描述】:

我必须从 s3 导入一个 redshift 中的 csv 文件。 表中的一列是 JSON 格式。

使用 COPY 命令时,我收到以下错误 -

Invalid timestamp format or value [YYYY-MM-DD HH24:MI:SS]   

使用的命令是-

COPY api_log FROM 's3://X/Y' credentials 'aws_access_key_id=;aws_secret_access_key=' delimiter ',' maxerror as 250 TRUNCATECOLUMNS;

提交;

样本数据是 -

c1 c2    c3

  X       Y     a:b,c:d

【问题讨论】:

【参考方案1】:

如果您在 json 中添加引号并将 REMOVEQUOTES 添加到副本中,那么它可以工作。

将测试文件放入s3:

echo x,y,'"a:b,c:d"' | aws s3 cp - s3://[bucket]/json/test_file.csv

创建表:

CREATE TABLE IF NOT EXISTS api_log
(c1 varchar,
c2 varchar,
json_colum varchar(65535));

加载:

COPY api_log 
FROM 's3://[bucket]/json/' 
CREDENTIALS 'aws_access_key_id=;aws_secret_access_key='
delimiter ',' 
maxerror as 250 
TRUNCATECOLUMNS
REMOVEQUOTES;

或者,如果您不喜欢引号,您可以使用制表符或其他不会出现在数据中的字符。例如:

echo -e "x\ty\ta:b,c:d" | aws s3 cp - s3://[bucket]/json/test_file.csv

然后:

COPY api_log 
FROM 's3://[bucket]/json/' 
CREDENTIALS 'aws_access_key_id=;aws_secret_access_key='
delimiter '\t' 
maxerror as 250 
TRUNCATECOLUMNS
REMOVEQUOTES;

无论哪种方式,你都会得到:

select * from api_log;
 c1 | c2 | json_colum 
----+----+------------
 x  | y  | a:b,c:d

【讨论】:

以上是关于在 Redshift 中复制 JSON 列的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 复制命令错误“溢出,列类型:整数”

如何忽略错误但不跳过 redshift 复制命令中的行

将 JSON 文件加载到 Redshift

在 Redshift 中,如何复制表、添加 dist 和排序键以及保留列编码?

使用复制命令将 Json 文件加载到 redshift

Redshift JSON 性能