如何用Redshift Spectrum访问S3嵌套文件夹文件及检测新增内容
Redshift Spectrum 处理S3嵌套Parquet文件夹的方案
1. 如何查询嵌套文件夹内的多份Parquet文件
你的S3结构是TeamName/Year/Month/Day/,所有文件schema一致,可按以下步骤操作:
- 在Glue数据目录创建外部表时,将表位置设为
s3://你的存储桶名/TeamName/(指定到团队根目录即可,无需到Day层级) - 选择Parquet作为数据格式,填入统一的schema信息
- 若要优化查询效率,可利用路径中的
Year/Month/Day设置分区键:- 在Glue表中添加
year(字符串/整数类型)、month、day三个分区字段 - 配置Glue爬虫定期扫描
TeamName目录,爬虫会自动识别路径中的层级作为分区,同步到Glue表 - 在Redshift中关联该Glue外部表后,查询时可通过
WHERE year='2024' AND month='05'过滤分区,大幅提升速度
- 在Glue表中添加
- 若不需要分区,直接创建无分区的Glue表,Spectrum会自动递归扫描
TeamName下所有子文件夹的Parquet文件,无需额外配置
2. 新增文件/文件夹的自动检测
- 用Glue爬虫的方式:配置爬虫以固定频率(如 hourly)扫描
TeamName目录,新增的Day2或其他层级文件夹会被自动识别,爬虫会更新Glue表的分区信息,Redshift Spectrum查询时直接就能读取新数据 - 不用爬虫的方式:手动在Redshift中执行分区添加命令:
ALTER TABLE your_external_table ADD PARTITION (year='2024', month='05', day='02') LOCATION 's3://你的存储桶名/TeamName/2024/05/02/'; - 若未设置分区,直接扫描整个目录的话,新增的Parquet文件会被Spectrum自动检测到,查询时直接包含这些数据,无需任何操作
3. 能否基于S3根目录创建Spectrum表
完全可以。只需在Glue表中将位置设为s3://你的存储桶名/即可,但不推荐这么做:
- 根目录下若存在其他无关数据,Spectrum会扫描所有文件,不仅拖慢查询速度,还可能读取到不符合schema的文件导致报错
- 更合理的做法是将表位置限定在
TeamName目录,只扫描目标数据范围
内容的提问来源于stack exchange,提问作者Scooby
相关产品推荐
相关产品推荐

