当“自动”将数据从 S3 加载到 Redshift 表中时,大小写是不是重要? [复制]

Posted

技术标签:

【中文标题】当“自动”将数据从 S3 加载到 Redshift 表中时,大小写是不是重要? [复制]【英文标题】:Does case matter when 'auto' loading data from S3 into a Redshift table? [duplicate]当“自动”将数据从 S3 加载到 Redshift 表中时,大小写是否重要? [复制] 【发布时间】:2016-12-28 18:12:22 【问题描述】:

我正在使用 COPY 命令、gzip 标志和“自动”格式将数据从 S3 加载到 Redshift,按照关于从 S3 加载的 this 文档、关于在 AWS 中使用“自动”格式的 this 文档, 和 this 用于处理压缩文件的文档。

我的数据是高度嵌套的 JSON 格式,并且我创建了 redshift 表,以便列名与 JSON 结构的***别完全匹配(允许“自动”工作)。

例如,我的 JSON 数据如下所示:

"timestamp":"value":"1480536125926814862",
"Version":"value":"0.5.0",
"token":"timestamp":"1480536122147094466",
  "field1":"A23",
  "field2":"0987adsflhja0",
  "field3":"asd0-fuasjklhf",
"camelCaseField":"value":"asdf1234",
"camelCaseField2":"value":"asdfasdfasdf1234",
"sequence":"value":1

我的表创建语句如下所示:

CREATE TABLE temp_table (
timestamp varchar(40),
Version varchar(40),
token varchar(500),
camelCaseField varchar(40),
camelCaseField2 varchar(40),
sequence varchar(10));

然后当我使用此命令从 S3 加载表时:

COPY temp_table FROM 's3://bucket-name/file_name.log.gz' 
credentials '<aws-cred-args>'
json 'auto'
gzip;

它加载数据没有错误,但是任何带有驼峰大小写的字段都是空的,只有时间戳、令牌和序列中有数据。这真的是案例问题吗?

【问题讨论】:

我还尝试使用双引号括起来的列名创建表来强制大小写匹配,但红移将它们强制转换为小写: 为了解决这个问题,我现在正在下载所有 JSON 文件,使用 jq 小写所有 JSON 属性名称,将新的 JSON 重新上传到 S3,然后执行 COPY 到 redshift。跨度> 这是一个可行的解决方案***.com/a/58411291/7127824 【参考方案1】:

使用“auto”开关的 S3 数据的 Redshift COPY 命令确实对 JSON 区分大小写。我拿了一个经过 gzip 压缩的 JSON 文件,将所有内容切换为小写,重新压缩,对表格进行核对并使用相同的复制命令,它工作正常。

似乎没有任何方法可以强制 redshift 对某些列名使用 camelCase。我使用双引号来创建列,redshift 仍然将它们强制转换为小写。

【讨论】:

【参考方案2】:

Redshift 将所有列名称更改为小写名称(无论您在定义表时使用什么大小写)。因此,在您的情况下,只有小写名称的字段才会被加载。

【讨论】:

以上是关于当“自动”将数据从 S3 加载到 Redshift 表中时,大小写是不是重要? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python 将数据从 Redshift 加载到 S3

Node-Redshift 是不是支持复制命令(查询)将数据从 S3 加载到 Redshift?

将批量数据从 s3 加载到 redshift

使用复制命令将数据从 s3 加载到 redshift

如何使用无服务器架构将数据从 S3 加载到 Redshift?

使用引号将数据从 S3 加载到 Amazon Redshift