我正在尝试使用 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 列中。
首先 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 的数据格式不同。 这看起来很奇怪,但这可能就是您将其添加到这个问题中的方式。
此外,双引号上不需要反斜杠。 我希望它们在您的工作案例中被忽略。
我希望您获得的属性是单个字符串,而不是嵌套对象,这会导致字符串太大错误。