Apache Drill中WHERE子句搭配LIMIT/OFFSET返回0结果,求正确用法
解决Apache Drill中WHERE子句结合LIMIT/OFFSET返回0结果的问题
我来帮你搞定这个问题——你遇到的情况大概率不是LIMIT和OFFSET的用法问题,而是列引用逻辑或者数据类型不匹配导致的,咱们一步步排查解决:
先搞清楚核心逻辑:LIMIT/OFFSET是在WHERE过滤之后执行的
首先要明确:Apache Drill的执行顺序是先跑WHERE子句过滤数据,再对过滤后的结果应用LIMIT和OFFSET。所以你的查询返回0条,本质是WHERE COLUMN[0]='1'这个条件本身就没匹配到任何数据,和LIMIT/OFFSET无关。
常见原因及解决方案
1. CSV文件有表头,但你用了索引引用列
如果你的EMPLOYEES.csv第一行是表头(比如ID,NAME,DEPT这种),Drill默认会把第一行解析为列名,这时候COLUMN[0]指向的是表头的第一个字段名(比如ID),而不是数据行的第一列值。自然用COLUMN[0]='1'匹配不到任何数据。
解决办法:
- 直接用表头的列名代替索引,比如第一列叫
EMP_ID,查询改成:
(注意:如果SELECT * FROM dfs.`C:\EMPLOYEES.csv` WHERE EMP_ID = 1 LIMIT 20 OFFSET 5 ROWS;EMP_ID是数值类型就不要加引号,是字符串类型再加单引号) - 或者禁用表头解析,让Drill把所有行都当成数据行,执行以下会话设置后再查:
ALTER SESSION SET `store.csv.first_row_is_header` = false; SELECT * FROM dfs.`C:\EMPLOYEES.csv` WHERE COLUMN[0]='1' LIMIT 20 OFFSET 5 ROWS;
2. 数据类型不匹配
如果COLUMN[0]实际存储的是数值类型(比如整数1),但你用字符串'1'去匹配,Drill的类型校验比较严格,会认为两者不相等,导致无结果。
解决办法:
去掉引号,用数值匹配:
SELECT * FROM dfs.`C:\EMPLOYEES.csv` WHERE COLUMN[0] = 1 LIMIT 20 OFFSET 5 ROWS;
快速验证步骤(定位问题)
你可以先执行不带LIMIT/OFFSET的WHERE查询,看看是否有结果:
SELECT * FROM dfs.`C:\EMPLOYEES.csv` WHERE COLUMN[0]='1';
如果这个也返回0条,就完全可以确定是WHERE条件的问题,按照上面的方案调整即可;如果这个能返回数据,那再检查LIMIT/OFFSET的语法——不过从你给出的单独使用LIMIT/OFFSET的语句来看,语法是没问题的。
内容的提问来源于stack exchange,提问作者santosh
相关产品推荐
相关产品推荐

