码迷,mamicode.com
首页 > 其他好文 > 详细

hive select查询语句底层实现的某些细微差别

时间:2014-06-28 23:54:20      阅读:400      评论:0      收藏:0      [点我收藏+]

标签:java   使用   文件   数据   2014      

    最近,由于工作的需要,学习了基于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集群上。

hive select查询语句底层实现的某些细微差别,布布扣,bubuko.com

hive select查询语句底层实现的某些细微差别

标签:java   使用   文件   数据   2014      

原文地址:http://www.cnblogs.com/kuangyufeng/p/3794175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!