问题描述
数据文件按设备号和日期(yyyyMMdd)两层分区,现在想查询指定设备下的所有数据,使用DIR0关键字过滤:
select * from dfs.`table1` where DIR0 = 'device0001'
发现planning时间很长,进一步检查日志发现是在planning阶段扫描了table1下的所有目录,而不是只扫描了device0001目录,而设备数量有8000多个,每个目录下有几百个parquet文件总共300万个文件左右,因此扫描的时间很长。
问题解决
通过跟踪DRILL代码发现,DRILL在planning开始的时候,需要创建一个Table对象并扫描此Table下的所有文件,并且未考虑DIR0指定的条件。
在drill的jira上查到相关bug记录:DRILL-2517和DRILL-3996,后者2015年记录但至今仍未解决,因此短期内可能无法通过升级DRILL版本解决。
变通的解决方法是,将查询语句修改为:
select * from dfs.`table1/device0001`
即把DIR0里的条件放在FROM子句里,此时planning时间显著降低。
欢迎转载
请保留原始链接:https://bjzhanghao.com/p/2354
请保留原始链接:https://bjzhanghao.com/p/2354