【问题标题】:Amazon Redshift how to copy from s3 and set a job_idAmazon Redshift 如何从 s3 复制并设置 job_id
【发布时间】:2013-05-07 16:06:40
【问题描述】:

Amazon Redshift 提供了使用“复制”命令从 s3 对象加载表数据的能力。是他们使用复制命令的一种方式,而且还为每个插入的行设置了额外的“col=CONSTANT”。

我想在每个复制的行上设置一个 job_id(不在源数据中),我认为必须执行几百万次插入以使每行都有一个作业属性,当“复制”以更好的性能让我完成了 99% 的工作。

也许有更聪明的解决方案?

【问题讨论】:

    标签: postgresql amazon-web-services amazon-redshift


    【解决方案1】:

    如果您希望在单个 COPY 命令中添加的所有行都具有相同的 job_id 值,那么您可以将数据复制到暂存表中,然后将 job_id 列添加到该表中,然后将暂存表中的所有数据插入到 final像这样的表:

    CREATE TABLE destination_staging (LIKE destination);
    ALTER TABLE destination_staging DROP COLUMN job_id;
    COPY destination_staging FROM 's3://data/destination/(...)' (...)
    ALTER TABLE destination_staging ADD COLUM job_id INT DEFAULT 42;
    INSERT INTO destination SELECT * FROM destination_staging ORDER BY sortkey_column;
    DROP TABLE destination_staging;
    ANALYZE TABLE destination;
    VACUUM destination;
    

    ANALYZE 和 VACUUM 不是必需的,但强烈建议您更新查询分析器并将所有新数据放入正确的位置。

    【讨论】:

    • 如果您尝试同时加载多个作业,这将导致不一致的行为,这是必要的。我想我们可以使用“destination_staging_${jobId}”作为表格,这样可以保持直截了当。
    • @gbegley,这是正确的。您必须为每个 job_id 创建一个单独的临时表。
    【解决方案2】:

    似乎没有选项可以使用COPY 命令本身进行后/预处理。因此,您最好的选择似乎是将您打算 COPY 的文件预处理到 Redshift 中,添加 jobid 然后将它们加载到 Redshift 中。

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 1970-01-01
      • 2016-09-25
      • 2014-10-16
      • 2013-03-20
      • 1970-01-01
      • 2016-12-28
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多