假设我在红移表中有3个日期列(d1,d2,d3)。
d1 = max(d2,d3)
而不是我的应用程序计算值并设置它,在插入期间,如果我只指定d2和d3,可以redshift自动填充d1 = max(d2,d3)
吗?
答案 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的值