如何将镶木地板格式的特定列加载到 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 数据框中的时间戳?

如何将镶木地板文件从 s3 导入到 postgresql rds

使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中