如何将镶木地板格式的特定列加载到 Redshift 频谱中?
How do you load specific columns formatted in parquet into Redshift spectrum?
我正在尝试将特定列加载到 Redshift Spectrum 中,但数据似乎是按位置加载的,这意味着我为列名称输入的内容无关紧要。
为了使这个更具体:
假设我要加载的数据按位置存储在 parquet 中作为 A、B、C 列。我只想要 B 列,所以我写:
create external table spectrum.Foo(
B varchar(500)
)
STORED AS PARQUET
LOCATION 's3://data/';
不幸的是,当我这样做时,它实际上将 A 的数据加载到 Foo.B
我需要一些额外的语法吗?我搜索了文档,但找不到任何内容。
谢谢!
定义外部 table 不会将数据加载到 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;
这实际上只会将指定的列从外部 table 加载到 Redshift 中的本地 table。但是,您不需要这样做:Redshift Spectrum 和 Parquet 的优点是当您 运行 查询时:
select A, C from spectrum.Foo;
只会从S3中加载访问列的数据,减少对S3的IO操作,降低成本。
如果您已有 redshift table,Spectrify 提供了一种易于使用的方法来将数据移动到 Spectrum -- https://github.com/hellonarrativ/spectrify/
我正在尝试将特定列加载到 Redshift Spectrum 中,但数据似乎是按位置加载的,这意味着我为列名称输入的内容无关紧要。
为了使这个更具体:
假设我要加载的数据按位置存储在 parquet 中作为 A、B、C 列。我只想要 B 列,所以我写:
create external table spectrum.Foo(
B varchar(500)
)
STORED AS PARQUET
LOCATION 's3://data/';
不幸的是,当我这样做时,它实际上将 A 的数据加载到 Foo.B
我需要一些额外的语法吗?我搜索了文档,但找不到任何内容。
谢谢!
定义外部 table 不会将数据加载到 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;
这实际上只会将指定的列从外部 table 加载到 Redshift 中的本地 table。但是,您不需要这样做:Redshift Spectrum 和 Parquet 的优点是当您 运行 查询时:
select A, C from spectrum.Foo;
只会从S3中加载访问列的数据,减少对S3的IO操作,降低成本。
如果您已有 redshift table,Spectrify 提供了一种易于使用的方法来将数据移动到 Spectrum -- https://github.com/hellonarrativ/spectrify/