1

我正在尝试将特定列加载到 Redshift Spectrum 中,但似乎数据是按位置加载的,这意味着我为列名输入的内容并不重要。

为了更具体:

假设我要加载的数据按位置存储在镶木地板中作为 A、B、C 列。我只想要 B 列,所以我写:

create external table spectrum.Foo(
  B varchar(500)
)
STORED AS PARQUET
LOCATION 's3://data/';

不幸的是,当我这样做时,它实际上将 A 的数据加载到 Foo.B

我需要一些额外的语法吗?我搜索了文档,但找不到任何东西。

谢谢!

4

2 回答 2

0

如果您有一个现有的 redshift 表,Spectrify 提供了一种易于使用的方法来将数据移动到 Spectrum -- https://github.com/hellonarrativ/spectrify/

于 2018-04-28T04:18:30.213 回答
0

定义外部表不会将数据加载到 Redshift 中——它只是让您能够查询它。如果您只想提取列的子集,可以尝试以下一组查询:

create external table spectrum.Foo(
  A varchar(100), B varchar(100), C varchar(100)
) stored as parquet location 's3://data/';

这定义了外部模式:

create table local_data as select A, C from spectrum.Foo;

这实际上只会将外部表中的指定列加载到 Redshift 中的本地表中。但是,您不需要这样做:Redshift Spectrum 和 Parquet 的优势在于,当您运行查询时:

select A, C from spectrum.Foo;

它只会为访问的列从 S3 加载数据,减少对 S3 的 IO 操作次数并降低成本。

于 2017-07-07T22:34:33.207 回答