首页 > 代码库 > hive select查询语句底层实现的某些细微差别
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集群上。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。