Redshift COPY 从带有 JSON 字段的 CSV 文件到 SUPER 列

Posted

技术标签:

【中文标题】Redshift COPY 从带有 JSON 字段的 CSV 文件到 SUPER 列【英文标题】:Redshift COPY from CSV file with JSON field into SUPER column 【发布时间】:2021-06-15 16:15:50 【问题描述】:

我正在尝试使用从 S3 到 Redshift 的 COPY 命令以及如下所示的 CSV 文件:

uuid,new_json_column
a3299e1e-f45a-11e9-99cc-12b09cbafc98,"""this"": ""is a json"", ""file"": 0"
c9a31bb9d15fd5d9abe38f28fb2c824e,"""this"": ""is a json"", ""file"": 0"

在 Redshift 端,我有一个如下表结构:

CREATE TABLE IF NOT EXISTS testing_table (
    uuid VARCHAR(150) NOT NULL,
    json_field SUPER
)

我的 COPY 命令如下所示:

COPY testing_table
FROM 's3://some_s3_bucket/folder1/'
with credentials
'aws_access_key_id=***;aws_secret_access_key=***'
DELIMITER ',' 
EMPTYASNULL
BLANKSASNULL
TRUNCATECOLUMNS
REMOVEQUOTES
TRIMBLANKS
GZIP
DATEFORMAT 'auto'
TIMEFORMAT 'auto'
ACCEPTINVCHARS;

我无法加载 CSV 文件并出现错误:

Load into table 'testing_table' failed.  Check 'stl_load_errors' system table for details.

stl_load_errors 表中的行是这样的:

|userid|slice|tbl|starttime|session|query|filename|line_number|colname|type|col_length|position|raw_line|raw_field_value|err_code|err_reason|
|------|-----|---|---------|-------|-----|--------|-----------|-------|----|----------|--------|--------|---------------|--------|----------|
|100|3|805168|2021-06-15 16:00:56|28051|3897481|s3://some_s3_bucket/folder1/input_csv_file.csv.gz|1|json_field|super     |1048470   |5|uuid,new_json_column|new_json_column|1224|Invalid sequence for null constant|

知道我需要如何格式化 CSV 列或我必须在 COPY 命令中更改的选项吗?

【问题讨论】:

【参考方案1】:

我终于意识到发生了什么。第一个问题是我没有使用 IGNOREHEADER 1 选项,导致 COPY 由于值错误而失败。

这是最终有效的 COPY 命令:

COPY testing_table
FROM 's3://some_s3_bucket/folder1/'
with credentials
'aws_access_key_id=***;aws_secret_access_key=***'
CSV
IGNOREHEADER 1
DELIMITER ',' 
EMPTYASNULL
BLANKSASNULL
TRUNCATECOLUMNS
TRIMBLANKS
GZIP
DATEFORMAT 'auto'
TIMEFORMAT 'auto'
ACCEPTINVCHARS;

【讨论】:

只是为了让别人。无论我尝试什么,如果我使用 avro 文件加载它,我都无法让 Redshift COPY 加载 JSON 作为 SUPER 列的对象。 哦,Avro 没试过:/CSV 没有问题。

以上是关于Redshift COPY 从带有 JSON 字段的 CSV 文件到 SUPER 列的主要内容,如果未能解决你的问题,请参考以下文章

使用 COPY 命令将数据从 JSON 文件复制到 Redshift

使用多个清单文件从 S3 加载到 Redshift?

使用 JSONPATHS 文件到 Redshift 的 JSON 文件 - 无效的 jsonpath 格式

从 Amazon Redshift 中的 JSON 字段中提取数据

Redshift COPY csv 数组字段以分隔行

带有 iam_role 的 AWS Redshift COPY