浅谈hive

谈下一个新人对hive的理解,不喜勿喷。java

    hive是hadoop整个项目使用中最经常使用的辅助项目之一。数据库

    hadoop基础的组件有hdfs和mapreduce。hdfs完成整个hadoop集群中数据的存储,采用google的bigTable架构,其实我以为就是将数据平分为多份,而后平分给分布式中的各机器上,存储在上面的数据就像一个隐藏文件,你在本地硬盘上找不到它们,但却能够经过hadoop中hdfs指令显示和操做它们,像hadoop dfs -ls 路径。而mapreduce则是将存储在集群中的数据进行分布式计算,由原来1台电脑的工做放到集群中全部电脑上,所以它的运算效率会有显著的提升。服务器

    说完了hdfs和mapreduce,你应该对hadoop有个基本的了解了,我们再说下hive。架构

    hive是经过解析你所写的HiveQL语句,来进行mapreduce计算,实现数据仓库中分析数据的做用。hive其实就是针对mapreduce写了一系列的方法和类,我们能够经过写HIVEQL的形式执行mapreduce.用hiveQL能实现的功能你都能在mapReduce中写出来,若是你不闲麻烦的话。。。分布式

    说下hive的主要功能:数据ETL(抽取、转换、加载)工具、数据存储和大型数据集的查询和分析能力。工具

    hive包含了四种数据模型:表(Table)、外部表(External Table)、分区(Partition)、桶(bucket)。oop

    表和外部表我的感受用起来没什么区别, 有区别的地方只不过是外部表在建立的时候数据没有移动到数据仓库目录中,也就是说外部表不是由它本身来管理。而删除外部表的时候,只会删除元数据,外部表内的数据不会被删除。测试

    而分区和桶。。。就用分区。。不过度区和桶应该都是为了优化hive的分析效率而作的架构,我原来放10号到20号的数据都放个一个文件中,如今,我经过分区,将10号到20号的每日数据存储在以天为单位的存储文件中,这样,我查询某一天的数据时只是查询这一天的文件,而不是查询未分区前的整个文件,这样,效率就上来了,固然,这只是个人理解,可能还有其它做用。。。优化

    我理解的hive的基本工做是:将metadata存到hive自建的表中,而后经过操做和分析hive表中的数据,获得你想要的分析结果。google

    hive的元数据存储有三种方式:

    1、Single User Mode.其实就是将metadata存储在一个内存数据库(derby)中。内存才多大啊,因此平常中基本不用。

    2、Multi User Mode. 经过是链接本机的MySql,来获取元数据。这是平常和工做中最经常使用的一种方式。。貌似是工做中。。

    3、Remote Server Mode .其实就是经过本机的thrift协议访问另外一个服务器上的metaStoreServcer,metadata不在本地。

    关于hive配置,很少说了,网上一堆。。。

   关于hive中表的操做,我说下容易让人误会的地方:

    hive虽然有表的概念,但它是一个离线数据分析工具,建表只是为了分析服务的,而分析的数据你不可能一条一条插入进去,或者删几条。。而它的正常使用方式是将metadata导入到hive表中,再经过hiveQL分析hive表中的数据。因此hive中不提供手动插入一条或几条数据。有手动就得有自动,自动我举个例子:insert overwrite table abc select * from bbc;这就是我认为的自动。。。。不能手动增长数据了,只能导入数据或自动添加数据。那么删除和修改呢,妥妥的也不能。

    关于hive语句的介绍也很少说了,网上也一堆,说的都挺清楚明白的。不过,这里我还得举个例子,关于我今天写的一个,烦了我一天的mapjoin...

     mapjoin 有两个好处:1.关联的两张表中有一个表很是小时,mapjoin能够将小表中的数据加载到内存中,而后在map阶段会自动大表中的数据,效率还不错。like :select /*+ mapjoin*/ a.id,a,username from a join b on (a.id=b.id)。这是在对等的状况下,效率至关不错。

                          2.还有一个好处就是它能够实现不对等链接。。 join ..on  ()  ,on 后面会跟对等的条件,像a.id=b.id ,你若是跟个like 会报错。而mapjoin能够实现不对等条件,就是在join后面不用on了,直接用where,不过这个效率,试了下,我的感受效率不高。。like :select /*+ mapjoin*/ a.id,a,username from a join b where a.username like 'error')。

            关于hive其它的方面我尚未看。。等之后看完了,再谈下感觉吧。。

 

    PS: 关于mapjoin()的非等值测试:

    两张表:pv_temp_test1(大表)  ,title_keyword_test(小表)

             pv_temp_test1:  530180 条 

             title_keyword_test  5646 条

  测试语句 :

hive> insert overwrite table hbase_test_keyword 
select /*+ mapjoin(a)*/ a.keyword,b.dt,b.pid,b.area,count(*),count(distinct clientid) from title_keyword_test a join (select dt,pid,area,wd,clientid from pv_temp_test1 where wd!='' and wd != 'None') b where b.wd like concat('%',a.keyword,'%') group by  a.keyword,b.dt,b.area,b.pid;

   花费时间:4927秒......

PS:第一次写博客。。想把本身下班以后的时间利用起来,写了快2个小时,挺累,不喜勿怪。。。

相关文章
相关标签/搜索