Redshift根据其他列派生列值

时间:2018-06-06 11:03:11

标签: amazon-web-services amazon-redshift

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

d1 = max(d2,d3)

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

<强>更新

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

答案 1 :(得分:1)

在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));

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

如果以上操作不起作用,则另一个选项是插入数据,然后使用更新查询设置列c。

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

对于批量加载,有必要将数据加载到列a&amp; b首先使用copy命令,然后使用update query设置列c的值