分区依据的 Amazon Redshift Spectrum 不返回结果

Posted

技术标签:

【中文标题】分区依据的 Amazon Redshift Spectrum 不返回结果【英文标题】:Amazon Redshift Spectrum with partitioned by does not return results 【发布时间】:2021-08-29 10:03:19 【问题描述】:

给定一个按日期分区的 S3 存储桶:

year
|___month
    |___day
        |___file_*.parquet

我正在尝试使用以下命令在 amazon redshift Spectrum 中创建一个表:

create external table spectrum.visits(
    ip varchar(100),
  user_agent varchar(2000),
  url varchar(10000),
  referer varchar(10000),
  session_id char(32),
  store_id int,
  category_id int,
  page_id int,
  product_id int,
  customer_id int,
  hour int
)
partitioned by (year char(4), month varchar(2), day varchar(2))
stored as parquet
location 's3://visits/visits-parquet/';

虽然没有抛出错误信息,但查询的结果始终为空,即不返回结果。桶不为空。有人知道我做错了吗?

【问题讨论】:

您是否使用ALTER TABLE ADD PARTITION 添加了现有分区?见:Creating external tables for Amazon Redshift Spectrum - Amazon Redshift 我没有。通过添加`ALTER TABLE spectrum.visits ADD PARTITION (year='2021', month='4', day='1') location 's3://visits/visits-parquet/year=2021/month=4/day =1/' ` 对于每个日期,它开始产生结果。就是这样。 【参考方案1】:

在 Amazon Redshift Spectrum 中创建外部表时,它不会扫描现有分区。因此,Redshift 不知道它们的存在。

您需要为每个现有分区执行ALTER TABLE ... ADD PARTITION 命令。

(Amazon Athena 有一个 MSCK REPAIR TABLE 选项,但 Redshift Spectrum 没有。)

【讨论】:

以上是关于分区依据的 Amazon Redshift Spectrum 不返回结果的主要内容,如果未能解决你的问题,请参考以下文章

Redshift Spectrum 'alter table add partition' 安全性

Amazon EMR 与 Amazon Redshift

amazon-redshift 中的 CONCAT 函数

Amazon Redshift 按特定值排序

有用的 Amazon Redshift SQL 用户定义函数的任何示例?

不使用 jdbc 驱动程序查询 Amazon Redshift