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 根据其他列导出列值的主要内容,如果未能解决你的问题,请参考以下文章