针对S3动态分区目录结构生成Athena表的技术咨询
实现方案
1 核心规则确认
你的S3路径结构符合s3://<桶名>/${partner}/${customer}/data/${model}/任意子层级/<表名>.csv的规律,我们可以直接通过Athena的配置自动提取partner/customer/model三个字段,同时过滤不需要的内容:
- 过滤所有config目录
- 过滤后缀为zip、json的文件
2 单表创建(以tbl1为例)
使用Athena分区投影能力,无需手动加载分区即可自动识别全量路径数据,建表语句如下:
CREATE EXTERNAL TABLE IF NOT EXISTS tbl1 ( -- 替换为tbl1.csv实际包含的字段和类型,仅填CSV本身的字段 col1 string, col2 int, col3 timestamp ) PARTITIONED BY ( partner string, customer string, model string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = ',', 'field.delim' = ',', 'skip.header.line.count' = '1' -- 如果CSV没有表头,删除这一行配置 ) LOCATION 's3://<替换为你的S3桶名>/' TBLPROPERTIES ( 'projection.enabled' = 'true', 'projection.partner.type' = 'injected', 'projection.customer.type' = 'injected', 'projection.model.type' = 'injected', 'storage.location.template' = 's3://<替换为你的S3桶名>/${partner}/${customer}/data/${model}/**/', 'exclude_file_pattern' = '.*\\.zip$|.*\\.json$|.*/config/.*' )
如果CSV存在转义符、特殊分隔符,把SerDe替换为
org.apache.hadoop.hive.serde2.OpenCSVSerde即可适配。
3 多表批量创建
因为同名CSV的schema完全一致,你只需要重复以上建表逻辑,替换语句中的表名、CSV对应字段配置即可,其他参数不需要修改。
如果需要完全自动化批量建表,可以按以下逻辑写脚本执行:
- 调用S3
list_objects_v2接口扫描全桶,提取所有符合规则的CSV文件名,去重得到所有需要建表的tbl名称 - 遍历每个tbl名称,拼接生成对应建表SQL
- 调用Athena
start_query_execution接口批量执行建表语句
4 结果校验
建表完成后执行以下语句验证配置正确性:
SELECT partner, customer, model, * FROM tbl1 LIMIT 10;
如果三个额外字段取值正确、没有返回config目录/zip/json对应的无效数据,配置就已生效。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

