Spark中如何使用通配符读取指定日期/小时的分区数据?
问题:按时间分区表的子集读取方法
我有一张按ldt列(格式为YYYY-MM-dd-HH-mm-ss)分区的表test.emp_table,执行SHOW partitions test.emp_table;得到以下分区:
partition ldt=2023-02-26-00-47-01 ldt=2023-02-26-01-27-40 ldt=2023-02-26-23-48-06
想使用通配符读取这些分区的子集(比如加载某一天或某一小时的所有分区),但执行以下语句无法生效:
select * from test.emp_table where ldt = "2023-02-26-%"
解决方法
1. 使用LIKE操作符匹配前缀
=运算符不支持搭配通配符,需要改用LIKE来匹配字符串前缀:
- 读取2023-02-26当天所有分区:
SELECT * FROM test.emp_table WHERE ldt LIKE '2023-02-26-%';
- 读取2023-02-26 00点的所有分区:
SELECT * FROM test.emp_table WHERE ldt LIKE '2023-02-26-00-%';
2. 利用字符串截取精准匹配
如果需要更灵活的时间范围过滤,可以用SUBSTR函数截取ldt的指定部分:
- 读取2023-02-26当天所有分区:
SELECT * FROM test.emp_table WHERE SUBSTR(ldt, 1, 10) = '2023-02-26';
- 读取2023-02-26 01点的所有分区:
SELECT * FROM test.emp_table WHERE SUBSTR(ldt, 1, 13) = '2023-02-26-01';
3. 直接指定分区过滤(适用于Hive等引擎)
部分SQL引擎(如Hive)支持在PARTITION子句中直接指定分区规则,这种方式能直接跳过无关分区目录,性能更优:
- 读取2023-02-26当天所有分区:
SELECT * FROM test.emp_table PARTITION (ldt LIKE '2023-02-26-%');
也可以用正则匹配:
SELECT * FROM test.emp_table WHERE ldt RLIKE '2023-02-26-.*';
内容的提问来源于stack exchange,提问作者Aravind Yarram
相关产品推荐
相关产品推荐

