Redshift 根据其他列导出列值

Posted

技术标签:

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

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

d1 = max(d2,d3)

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

【问题讨论】:

【参考方案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的值

【讨论】:

以上是关于Redshift 根据其他列导出列值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据联接更新 Redshift 中的表列值?

MySQL - 根据更新其他表列值触发更新列值

我需要计算行的实例并根据多个列值删除重复项

Pandas:如何根据其他列值的条件对列进行求和?

Pyspark根据其他列值添加新列

如何根据在熊猫数据框中的其他列上应用条件来提取列值