1.hive简介


        1)hive是建立在hadoop之上的数据仓库基础架构,它提供了一系列的工具,可以用来进行数据提取转化加载(ETL)


              ,这是一种可以存储、查询、和分析存储在hadoop中的大规模数据的机制,hive定义了简单那的类sql查询语言,


              成为QL,他允许熟悉SQL的用户查询数据。同时,这个语言也允许使用MapReduce开发者的开发者自定义的mapper和


              reducer来处理内建的mapper和reducer无法完成的复杂的分析工作


          2)hive是SQL的解析引擎,它将SQL语句转译成M/R 的job,然后在hadoop上执行


         3)hive的表其实就是hdfs的目录、文件,按表明把文件夹分开。如果是分区表,则分区值是子文件夹,


              可以直接在M/R job里使用这些数据。




2.hive的系统架构:


    

  

hive 配置参数查询 hive硬件配置_数据


    解释:


         1)用户接口:CLI,JDBC/ODBC和WebUI


              CLI,即shell命令


              JDBC/ODBC是hive的java,与使用传统数据库jdbc的方式类似


              WebGUI是通过浏览器访问hive


         2)hive将元数据存储在数据库中(metastore),目前只支持mysql,derby。hive中的元数据宝库表的名字,表的列和


              分区及其属性,表的属性(是否是外部表),表的数据所在的目录等。


          3)解释器,编译器,有乎其完成HQL查询语句从词法分析,语法分析,编译,优化以及查询计划的生成,生成的查询计划存储在hdfs


               中,并在随后有mapreduce调用执行


         4)hive的数据存储在hdfs中,大部分的查询由mapreduce完成含*的查询,比如select * from table 不会生成mapreduce任务




3.hive配置与安装


    Hive只在一个节点上安装即可




    1).上传tar包




    2).解压


tar -zxvf hive-0.9.0.tar.gz -C /cloud/


    3).配置mysql metastore(切换到root用户)


配置HIVE_HOME环境变量
 
rpm -qa | grep mysql
 
rpm -e mysql-libs-5.1.66-2.el6_3.i686 --nodeps
 
rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm 
 
rpm -ivh MySQL-client-5.1.73-1.glibc23.i386.rpm


修改mysql的密码


/usr/bin/mysql_secure_installation


(注意:删除匿名用户,允许用户远程连接)


登陆mysql


mysql -u root -p




    4).配置hive

cp hive-default.xml.template hive-site.xml

修改hive-site.xml(删除所有内容,只留一个<property></property>)


添加如下内容:


<property>
 
 
 
 
</property>
 

 
<property>
 
 
 
 
</property>
 

 
<property>
 
 
 
 
</property>
 

 
<property>
 
 
 
 
</property>



    5).安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下


如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)

mysql -uroot -p
 
#(执行下面的语句  *.*:所有库下的所有表   %:任何IP地址或主机都可以连接)
 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
 
FLUSH PRIVILEGES;

    6)执行 hive ,进入hive的输入格式




4.hive的数据模型:


         hive的数据时存储在hadoop的hdfs之中的,没有专门的数据格式,存储结构有数据库,文件,表,视图


         创建表时,指定hive数据的列分割符与行分隔符,hive即可解析数据




    1)内部表:


              与数据库中的table在概念上是类似的,每一个table在hive中都有一个相应的目录存数数据。




         创建表:

create table inner_table(id int); 
 
 
           
     创建的表默认与hdfs中的 
   
 /user/hive/warehouse/inner_table 路径相对应

         


         加载数据

    

load data local inpath '/root/inner_table.dat' into table inner_table;


               如果是加载本地文件需要指定   local


         


         查询数据


            

select * from inner_table ;  //没有执行mr
 
           
     select count(*) from inner_table;  //执行mr




    2)分区表:


             partition对应于数据库中的partition列的密集索引,在hive中,表中的一个partion对应于表下的一个目录,


              所有的partition的数据都存储在对应的目录中


         


               创建分区表:

create table beautities(id int,name string,height int) partitioned by (nation string) row format delimited fields terminated by '\t'
 
           
      
      
 对应的hdfs的文件目录是:  
 /user/hive/warehouse/beauties




              加载数据到分区


load data local inpath '/home/b.c' into table beauties partition(nation='china') 
 
            对应的hdfs的文件目录是:/user/hive/warehouse/beauties/nation=china




                   文件b.c的内容是是:


     

1 
      
 zhangwenyan     170
 
           
      
      
 2       yuzihan 165
 
           
      
      
 3       wenwenjing      167



                 查看文件


         

select * from beauties where nation='china'



                 创建文件b.j

1 
      
 xiaoze 
      
 170
 
           
      
       
 2       cangjinkong 165


                   上传到hdfs的目录下


                  

hdfs dfs -put /home/b.j / 
 user/hive/warehouse/beauties/nation=japan/
 
           
      
      
 
 
           
      
     在执行select * from beauties ;


                   发现没有有关japan的数据,是因为hive的描述信息中并没有将这个文件夹目录作为beauties的分区


              


                   执行

alter table beauties add partition(nation='japan') localtion ' 
 / 
 user/hive/warehouse/beauties/nation=japan/ 
 '


                   在执行select * from     beauties 就有数据了


             


                     将查询出来的数据保存到表中


 

create table result row format delimited fields  terminated by '\t' as select nation, avg(height) as ag from beauties  
     
 
           
      
      
      
   
 group  
     
 by nation order by ag;




    3)外部表:


              指向已经在HDFS中存在的数据,可以创建partition。


              它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。


              内部表的数据过程和数据加载过程在同一个语句中完成,在数据加载的过程中,实际数据源会被移动到数据


                   仓库目录中;之后对数据的访问会直接在数据仓库的目录中完成。删除表时,表中的数据和元数据将会同时被删除。


             外部表只有一个过程,加载数据和创建表同时完成,并不会移动数据到数据仓库中,只是与外部数据建立一个连接


              。当删除一个外部表是,仅删除该连接。


         


              创建表:(先有数据后有表)


hive>create external table external_table1 (key string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
   
location '/home/external';

   在HDFS创建目录/home/external 
 
   #hadoop fs -put /home/external_table.dat /home/external