Hive如何从多级目录仅筛选csv.gz文件进行数据查询
当然没问题!你完全可以在base目录层级执行查询时只筛选出.csv.gz格式的文件,我给你两种实用的方案,适配你的目录结构:
方法1:用路径通配符直接定位目标文件
这种方式最简洁,利用Hive支持的递归通配符**匹配所有日期子目录,精准定位到logs文件夹下的.csv.gz文件:
CREATE EXTERNAL TABLE IF NOT EXISTS csvData ( `col1` string, `col2` string, `col3` string, `col4` string, `col5` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' -- 替换成你实际使用的SerDe类 WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "\"" ) STORED AS TEXTFILE LOCATION '/base/**/logs/*.csv.gz';
小提示:如果你的
.csv.gz是压缩文件,Hive默认支持gzip解压读取,只要确保STORED AS的格式和文件类型匹配就好,一般用TEXTFILE就可以。
方法2:递归遍历+规则过滤(适合复杂场景)
如果之后需要更灵活的文件过滤规则,可以先开启子目录递归遍历,再通过表属性指定只保留.csv.gz文件:
CREATE EXTERNAL TABLE IF NOT EXISTS csvData ( `col1` string, `col2` string, `col3` string, `col4` string, `col5` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "\"" ) STORED AS TEXTFILE LOCATION '/base' TBLPROPERTIES ( -- 开启递归遍历所有子目录 "hive.input.dir.recursive" = "true", "mapred.input.dir.recursive" = "true", "hive.supports.subdirectories" = "true", -- 用正则排除非csv.gz的文件 "hive.input.path.filter" = "org.apache.hadoop.hive.ql.io.PathFilterAcceptAllButRegex", "hive.input.path.filter.regex" = ".*\\.(?!csv\\.gz).*$" );
注意事项
- 记得把示例里的SerDe类替换成你实际使用的(就是你原来语句里的
org.apache.hadoop.hive.ser...部分)。 - 第一种方法更适配你当前的固定目录结构,操作起来更简单;第二种方法扩展性更强,适合后续可能调整过滤规则的情况。
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

