将 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
字段真的有引号 outside 和 inside 字段吗? (""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?