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

Posted

技术标签:

【中文标题】使用复制命令将数据从 s3 加载到 redshift【英文标题】:Loading data from s3 to redshift using copy command 【发布时间】:2016-07-17 09:52:10 【问题描述】:

我有一个场景,我需要将数据从 Amazon S3 加载到 Amazong Redshift 数据库中。

S3 中的文件都是 JSON,它们位于存储桶中的各个文件夹下。每个文件夹都标明了它的生成日期。

例如,这是 S3 中的示例文件夹结构:

    铲斗 (B1) A. 文件夹 (F1) 一世。文件 1.json、文件 2.json ... 等等 B. 文件夹 (F2) ii. file22.json、file23.json ... 等等

每个 JSON 文件都没有单个根元素。它们具有以下格式 -

file1.json


Key : Value,
Key1 : [ some  array],
Key2 : value3,



Key : Value1,
Key1 : [ some  array1],
Key2 : value2,

我想知道是否有一种方法可以使用复制命令将这些数据递归地(因为 json 位于多个文件夹中)加载到 redshift 中。

(或)

如果除了使用复制命令之外还有其他更好的方法来加载数据。

【问题讨论】:

【参考方案1】:

选项 1:键前缀匹配

在 S3 中,没有文件夹之类的东西。相反,路径被视为对象键。只要您的密钥遵循通用模式并假设除了您要导入的文件之外没有其他文件与该模式匹配,例如:

s3
└── b1-bucket
    ├── f1/20160728/file1.json
    ├── f1/20160728/file2.json
    ├── f1/20160729/file1.json
    └── f2/20160728/file1.json

然后下面的COPY 命令将匹配(并复制)所有这些文件:

COPY your_table FROM 's3://b1-bucket/f' CREDENTIALS '' FORMAT AS JSON 'auto';

如in the documentation所述:

s3://copy_from_s3_objectpath 参数可以引用单个文件或一组具有相同键前缀的对象或文件夹。

选项 2:清单文件

另一种选择是将清单文件添加到COPY 语句,它基本上只是一个包含您要导入的文件列表的文件:


  "entries": [
    "url":"s3://b1-bucket/f1/20160728/file1.json", "mandatory":true,
    "url":"s3://b1-bucket/f1/20160728/file2.json", "mandatory":true,
    "url":"s3://b1-bucket/f1/20160729/file1.json", "mandatory":true,
    "url":"s3://b1-bucket/f2/20160728/file1.json", "mandatory":true
  ]

见http://docs.aws.amazon.com/redshift/latest/dg/loading-data-files-using-manifest.html

【讨论】:

以上是关于使用复制命令将数据从 s3 加载到 redshift的主要内容,如果未能解决你的问题,请参考以下文章

将批量数据从 s3 加载到 redshift

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

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

将数据从 AWS S3 复制到 Aurora Postgres

有没有办法将数据从 redshift 加载到 HDFS?

将数据从 Amazon S3 复制到 Redshift 并避免重复行