hive select查询语句底层实现的某些细微差别
最近,由于工作的需要,学习了基于Hadoop的一个数据仓库工具hive。遇到并解决了一些问题,但是有个select语句的细微差别值得注意。
首先来看两条hql语句:
SELECT * FROM MY_TABLE where dt=2014031205 limit 10 SELECT ID,NAME,GENDER,USERNAME,PASSWORD,ISVALID FROM MY_TABLE where dt=2014031205 limit 10
理论上,上述两条hql查询语句的查询结果应该是一致的,这也正是我们所期待。其中dt为分区字段名。
但是当hive建表时没有指定location(根路径)并且hive数据库表与对应的hdfs文件(表的关联数据文件)分别在两个不同的hadoop集群的时候,上述两条hql语句会产生截然不同的结果。前面一条hql语句会查询到正确的结果,但是第二条hql语句会报如下类似的异常:
java.io.FileNotFoundException: File does not exist: /2014031205/201403120538.txt
从异常提示可以看出SELECT加指定字段名查询时,其底层MapReduce实现使用的是相对路径。而SELECT * 底层实现使用的是绝对路径。
解决办法:
1、建表时指定location根路径。
2、将hive数据库和对应的hdfs文件系统放到一个hadoop集群上。