【问题标题】:Redshift derive column value based on other columnRedshift 根据其他列导出列值
【发布时间】:2018-06-06 11:03:11
【问题描述】:

假设我在红移表中有 3 个日期列 (d1,d2,d3)。

d1 = max(d2,d3)

如果我只指定 d2 和 d3,而不是我的应用程序计算值并设置它,如果我只指定 d2 和 d3,redshift 可以自动填充d1 = max(d2,d3)吗?

【问题讨论】:

    标签: amazon-web-services amazon-redshift


    【解决方案1】:

    有两种方法可以将数据加载到 Amazon Redshift。

    第一种是通过COPY 命令,从存储在 Amazon S3 中的文件加载数据。文件中的每一列都将映射到表中的一列,因此您无法在此过程中“计算”一列。

    第二个是通过INSERT 命令。这在与 Amazon Redshift 一起使用时效率不高,最好用于插入批量行而不是一次插入一行。

    一种常见的做法是将数据加载到临时表中,根据需要对其进行操作,然后将其重新插入到目标表中。

    您甚至可以使用 Redshift Spectrum 做一些花哨的事情,您可以直接从 S3 中的文件中选择并插入到表中。这也将允许您包含术语,例如:

    INSERT INTO normal-table
    SELECT max(d2,d3), d2, d3 FROM spectrum-table
    

    另一种方法是加载数据,然后使用UPDATE 命令根据现有列设置额外列的值。

    更新:

    在 Amazon Redshift(事实上,在 any 列式数据库中)使用 UPDATE 语句似乎不是一个好主意。这是因为每一列都是单独存储的,但顺序相同。更新一个值需要在存储空间的末尾重新写入整行,而不是就地更新。因此,您需要在此类更新后VACUUM 数据库。

    【讨论】:

      【解决方案2】:

      在 postgresql(redshift 所基于)中,你可以像这样做你想做的事:

      create table test (a int, b int, c int);
      
      insert into test (a, b, c) 
      values (1, 2, greatest(1, 2))
             (4, 1, greatest(4, 1));
      

      它也应该在红移中工作,尽管我目前无法验证。但这不适用于通过复制命令批量加载数据。

      如果上述方法不起作用,另一种选择是插入数据,然后使用更新查询设置 c 列。

      insert into test (a, b) values (1, 2);
      update test set c = greatest(a, b) where c is null;
      

      对于批量加载,需要先使用复制命令将数据加载到列a和b中,然后使用更新查询设置列c的值

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2020-02-06
        • 1970-01-01
        • 2021-09-27
        相关资源
        最近更新 更多