将 csv 和 json 数据从 S3 复制到 Redshift

Posted

技术标签:

【中文标题】将 csv 和 json 数据从 S3 复制到 Redshift【英文标题】:Copy csv & json data from S3 to Redshift 【发布时间】:2020-04-24 15:55:50 【问题描述】:

我有来自 s3 存储桶的以下格式的数据。

"2010-9","aws cloud",""id":1,"name":"test""
"2010-9","aws cloud1",""id":2,"name":"test2""

我想复制下面的数据库中的数据。

表格

year   | env        | desc
2010-9 | aws cloud  |"id":1,"name":"test"
2010-9 | aws cloud1 |"id":2,"name":"test2"

我已经写了这个命令,但是没有用。你能帮帮我吗?

copy table
from 's3://bucketname/manifest' credentials 'aws_access_key_id=xx;aws_secret_access_key=xxx'
delimiter ','
IGNOREHEADER 1
REMOVEQUOTES
IGNOREBLANKLINES
manifest;

【问题讨论】:

desc 字段真的有引号 outsideinside 字段吗? (""id":1,"name":"test"") 如果是这样,则 Redshift 无法解析它,因为内部引号使它看起来像该字段已结束。您要么需要以不同的格式生成文件,要么在将文件加载到 Redshift 之前对文件进行一些预处理。 “不工作”是什么意思?您是否收到错误消息? 是的。 desc 使用逗号归档数据拆分,例如“id”:1。是否有任何属性可以为归档添加单个冒号“” 第三个字段中的引号过多。它无法解析。您可能能够“按原样”加载所有字段(包括引号),然后执行一些花哨的 SQL 将数据提取到不同的表中。您需要使用 REGEX 函数。 你能提供我花哨的查询来从单个文件中分割出来吗?我自己试过但没有运气 SELECT SUBSTRING_INDEX(desc, ',', 1) c1, SUBSTRING_INDEX(SUBSTRING_INDEX(desc, ',', 2), ',', -1) c2, SUBSTRING_INDEX(SUBSTRING_INDEX(desc, ', ', 3), ',', -1) 来自测试的 c3 【参考方案1】:

你就快到了 - 你只需要转义第三个字段 (desc) 内的双引号。根据

If double-quotes are used to enclose fields, then a double-quote
       appearing inside a field must be escaped by preceding it with
       another double quote.  For example: "aaa","b""bb","ccc"

这是根据 rfc-4180 - https://www.ietf.org/rfc/rfc4180.txt

我还在 Redshift 中将 json 加载到文本字段中,然后使用 json 函数解析该字段。效果很好。

【讨论】:

以上是关于将 csv 和 json 数据从 S3 复制到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

如何将抓取的数据从 Scrapy 以 csv 或 json 格式上传到 Amazon S3?

将大型 csv 文件从 S3 读入 R

将 csv 文件从 s3 复制到 redshift 的问题

将文件(带有特定后缀)从 S3 复制到 Redshift

将数据从本地复制到 S3 到 Redshift 表时出现问题

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