【问题标题】:Copy csv & json data from S3 to Redshift将 csv 和 json 数据从 S3 复制到 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

标签: sql amazon-web-services amazon-s3 amazon-redshift


【解决方案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 函数解析该字段。效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多