Redshift 复制命令并解析为 JSON

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

我正在尝试使用 COPY 命令将数据从 S3 加载到 Redshift。 我尝试加载的表有多个列,其中一列是超级列。我想在该列中加载 JSON。

对于这个例子,假设表格是:

CREATE TABLE my_table (
  id INT,
  properties SUPER
);

这是我用来加载数据的命令

COPY my_table ("id","properties")
FROM 's3://.....'
CREDENTIALS 'aws_access_key_id=...;aws_secret_access_key=...'
region 'us-east-1'
ACCEPTANYDATE
ACCEPTINVCHARS AS '~'
ENCODING UTF8
ROUNDEC
DATEFORMAT AS 'auto'
TIMEFORMAT 'auto'
COMPUPDATE OFF
STATUPDATE OFF
TRUNCATECOLUMNS
BLANKSASNULL
EMPTYASNULL
TRIMBLANKS
JSON 'auto'
GZIP
;

当我尝试从 S3 加载数据时,出现此错误

String value exceeds the max size of 65535 bytes                                                    

我尝试加载的 JSON 之一的属性值太长。 示例:

{
id: 123,
properties: '{\"Is Active\":true,\"Tags\":[\"TAG1\"....}'#longer than 65535 bytes
}

我尝试手动将值加载到表中并且成功了

INSERT INTO my_table ("id", "properties")
VALUES(123, JSON_PARSE('{\"Is Active\":true,\"Tags\":[\"TAG1\"....}'))

正如您在 COPY 命令中看到的,我正在使用

TRUNCATECOLUMNS
属性。

我的理解是 COPY 命令理解属性值是 VARCHAR,并且不会将其解析为 JSON。

我想知道是否有办法强制复制命令使用 JSON_PARSE 将列解析为 JSON,或者是否有任何其他解决方案能够将属性数据加载到 SUPER 列中。

json copy amazon-redshift super
1个回答
0
投票

首先 TRUNCATECOLUMNS 是一个 COPY 属性,仅适用于 CHAR 和 VARCHAR 数据类型。 因此,只有当您复制到 max VARCHAR 中,然后在文本是有效的 JSON 的情况下将此文本转换为 SUPER 时,这才能对您有所帮助。 可能的解决方案,除了太大的字符串将不是有效的 JSON。

接下来你的 JSON 看起来很奇怪。 我不确定这就是您的 S3 文件中的数据,或者这是否是您在此处显示数据的方式的产物。 一般来说,单引号无效,您的密钥需要用双引号引起来。 您的文件应如下所示:

{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}

JSON 文件中的数据格式与传递给 JSON_PARSE 的数据格式不同。 这看起来很奇怪,但这可能就是您将其添加到这个问题中的方式。

此外,双引号上不需要反斜杠。 我希望它们在您的工作案例中被忽略。

我希望您获得的属性是单个字符串,而不是嵌套对象,这会导致字符串太大错误。

© www.soinside.com 2019 - 2024. All rights reserved.