如何将镶木地板格式的特定列加载到 Redshift 光谱中?
Posted
技术标签:
【中文标题】如何将镶木地板格式的特定列加载到 Redshift 光谱中?【英文标题】:How do you load specific columns formatted in parquet into Redshift spectrum? 【发布时间】:2017-07-07 16:27:31 【问题描述】:我正在尝试将特定列加载到 Redshift Spectrum 中,但数据似乎是按位置加载的,这意味着我为列名添加什么并不重要。
为了更具体:
假设我要加载的数据按位置存储在镶木地板中作为 A、B、C 列。我只想要 B 列,所以我写:
create external table spectrum.Foo(
B varchar(500)
)
STORED AS PARQUET
LOCATION 's3://data/';
不幸的是,当我这样做时,它实际上将 A 的数据加载到 Foo.B 中
我需要一些额外的语法吗?我搜索了文档,但找不到任何东西。
谢谢!
【问题讨论】:
【参考方案1】:定义外部表不会将数据加载到 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操作次数,降低成本。
【讨论】:
感谢您的解释。但是,使用该代码,我得到错误:HIVE_UNKNOWN_ERROR: Path is not absolute: s3://data error
。 AWS Forum Discussion有进一步解释【参考方案2】:
如果您有一个现有的 redshift 表,Spectrify 提供了一种易于使用的方法来将数据移动到 Spectrum -- https://github.com/hellonarrativ/spectrify/
【讨论】:
以上是关于如何将镶木地板格式的特定列加载到 Redshift 光谱中?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Redshift:如何存储大小大于 100K 的文本字段
如何使用 Spark 将镶木地板文件加载到 Hive 表中?
将数据从 PySpark 加载到 Redshift 时如何执行列编码
如何将镶木地板文件的 int64 数据类型列转换为 SparkSQL 数据框中的时间戳?