分区依据的 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' 安全性