2015-04-23 99 views
4

有没有办法在Amazon Redshift(或Postgres,因为它基于它)中更改列顺序?或者可以在特定位置添加一列?如何更改Amazon Redshift中的列顺序

在MySQL那里你可以这样做:

ALTER TABLE MY_TABLE 
ADD COLUMN {NEW_COL} AFTER {EXISTING_COL} 

但是,这并不在红移工作。有任何想法吗?

+0

纯粹主义者会说,你不应该需要的,因为列应通过名字,不是为了被引用,但在实践中SQL *不*请客列作为排序的,所以它有点有意义的想选择该订单。 [ALTER TABLE文档](http://www.postgresql.org/docs/9.4/interactive/sql-altertable.html)没有提及任何方式来做到这一点,但这并不证明没有某些类型的解决方法,特别是在使用“列式”存储模型的Redshift中。 – IMSoP

+0

使用COPY命令导入数据时,需要表格中的列顺序与CSV文件的列顺序相匹配。 –

+0

可能更好的链接是[Redshift文档](http://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html),因为它在前一段时间与Postgres不同。然而,现在你提到了COPY,我想我们可能在这里有一个[X/Y问题](http://meta.stackoverflow.com/questions/66377/what-is-the-xy-problem)... – IMSoP

回答

3

从您的意见中,似乎您实际需要的是能够将COPY从具有特定顺序的列的文件中放入表中。

按照Redshift documentation for the COPY command

(列1 [,列2,...])

指定可选的列的列表来加载数据字段到特定的列。在COPY语句中,列的顺序可以是任意顺序,但从平面文件(例如Amazon S3存储段)中加载时,它们的顺序必须与源数据的顺序相匹配。 [...] 如果未指定列列表,则该命令的行为就像指定了完整的按顺序列列表一样。

因此,而不是重新排序在表中的列,你只需要在COPY语句指定它们,如some of the examples in the docs

copy venue_new(venueid, venuename, venuecity, venuestate) 
from 's3://mybucket/data/venue_noseats.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|'; 
+0

对于我来说,改变复制命令要比改变列顺序要困难得多。似乎有办法在postgres中做到这一点,我检查它是否可以在Redshift中工作:http://stackoverflow.com/questions/285733/how-do-i-alter-the-position-of-a- column-in-a-postgresql-database 但是,感谢您的努力 –

+0

@MartinTaleski行,认为这是值得的建议。请注意,视图不会帮助写入表格,其他选项需要手动删除并重新插入现有数据。 – IMSoP

+0

他需要什么并不重要,标题是“如何更改Amazon Redshift中的列顺序”。 我实际上需要这样做的原因超出了这个问题的范围。 “做一些完全不同的事情”应该被添加到实际的答案中。 –

1

答案是否定的,红移不(容易)支持列洗牌,这很奇怪,因为我相信表格是作为单独的列存储的。如果没有卸载/加载或表格复制,没有办法做到这一点。

据说卸载/加载是首选方法,因为它将利用您在表中配置的任何并行性。

因此,标准的方法是必要的:

有可能是一个“秘密方式”,只有有问题的一列(转储列要做到这一点,删除列,添加列,重新加载列),但听起来令人难以置信的粗略,应该避免。

-1

Redshift根本不支持排序。 我必须在我的情况下解决同样的问题,这就是我已经做到的。

最佳选择是在卸载之后,逐个更改并重新创建。

1)卸载到S3

unload ('select (Column1,column2,Column3,...,Column_n) from orginal_table') to 's3://<your_bucket>/<your_file>' CREDENTIALS 'aws_access_key_id=<your_key>;aws_secret_access_key=<your_secret>' MANIFEST DELIMITER '|' GZIP NULL AS 'null_string' ESCAPE ALLOWOVERWRITE; 

2)丢弃和/或重新创建

Create duplicate_table(Column1,column2,Column3,...,Column_n);**with new sequence make sure your seq 

3)重新加载。

copy duplicate_table(Column1,column2,Column3,...,Column_n) from 's3://<your_bucket>/<your_file>manifest' CREDENTIALS 'aws_access_key_id=<your_key>;aws_secret_access_key=<your_secret>' MANIFEST DELIMITER '|' GZIP NULL AS 'null_string' ESCAPE ALLOWOVERWRITE; 
+0

Redshift支持'alter table'。 详情请参阅[他们的文档](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html)。 虽然它似乎不支持通过它重新排序列。 – N00b

+0

是的,同意!红移确实支持改变,但这里我的意思是改变仅用于订购。我纠正了我的陈述。 –