Hive学习心得&Hive的UDF,hive学习


一:Hive基本介绍

Hive是建立在Hadoop上的数据仓库基础构架,它提供了一系列工具可以用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模的数据机制。

使用语言:QL语言(类SQL查询语言)。能处理内建的mapper和reducer无法完成的复杂分析工作。

1.Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后再Hadoop执行。

2.Hive的表其实是HDFS的目录(/文件夹),按表名把文件夹区分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。

 

二:Hive的系统架构

1.用户接口主要有三个:CLI,JdbC/ODBC,WebUI

                  (1)CLI,即shell命令行。

                  (2)JDBC/ODBC,是Hive的Java接口,与使用传统数据库JDBC方式类似。

                  (3)WebUI,是通过浏览访问Hive。

2.Hive将元数据存储在数据库(metastore)中,目前只支持MySQL,derby。(Hive中的元数据包括表名,表列,和分区及其属性,表属性,表的数据所在目录等)

3.解析器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,并在随后有MapReducer调用执行。

4.Hive的数据存储在HDFS中,大部分的查询由MapReducer完成(包括含*的查询,比如select * from table不会生成MapReducer任务)。

 

三:Hive的安装

Hive只需在集群中的一个节点安装,Hive的默认是将元数据以derby的方式存储(在哪个目录下运行Hive,就在哪个目录下生成metastore_db数据库保存元数据,不利于多台client操作Hive)。

so:先安装MySQL数据库

      1.rpm -ivh Mysql-Server.rpm

      2.rpm -qa | grep mysql       //过滤出MySQL包

      3.rpm -e mysql-lib...   --nodeps          //强行删除上一布中过滤出的MySQL包

      4.运行/usr/bin/mysql_secure_installation  //配置登陆用户名&密码

      5.mysql --uroot -p123    //进入MySQL....按照成功

//把MySQL作为Hive的metastore

//下面即配置Hive

      1.删除hdfs上的Hive目录

         hadoop fs -rmr /user/hive

      2.修改conf配置文件

添加如下内容:
 <property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://centos:3308/hive?createDatabaseIfNotExist=true</value>
   <description>JDBC connect string for a JDBC metastore</description>
 </property>

 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
   <description>Driver class name for a JDBC metastore</description>
 </property>

 <property>
   <name>javax.jdo.option.ConnectionUserName</name>
   <value>root</value>
   <description>username to use against metastore database</description>
 </property>

 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>123</value>
   <description>password to use against metastore database</description>
 </property>
 
     3.安装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;

 

四:Hive语法

1.查看表(数据库)

   show tables(database);

2.创建表(列之间以'\t'做分隔符)

   create table student(id bigint,name string) row format delimited fields terminated by '\t';

3.上传数据

   load data local inpath '/usr/local/xx.txt' into table student;

4.创建一张外部表

   create external table ext_student (id int,name string) row format delimited fields terminated by '\t' location '/data';

5.创建分区表

   create external table people (id int, name string) partitioned by (nation string) row format delimited fields terminated by '\t' location '/people';

6.分区表添加数据(指定分区)

   load data local inpath '/usr/local/xx.txt' into table people partition(nation='China');

7.暴力方式:

   手动在HDFS中创建一个分区的文件夹,往里面添加数据。

   问题:select查询不到语句

   原因:手动方式是元数据没有在数据库中记录。

   解决:暴力方式往数据库中添加分区信息

   在Hive中运行:

   alter table people add partition(nation="Japan") location '/people/nation=Japan';

8.分区查询

   select * from people where nation="China";

9.使用sqoop工具将MySQL中的表数据远程导入HDFS下的Hive目录中

   sqoop import --connect jdbc:mysql://192.168.56.1:3308/hive_test --username root --password 123 --table people_info --hive-import --hive-overwrite --hive-table people_info    --fields-terminated-by '\t';

PS:一定将Hive加入环境变量中。

 

五:Hive的UDF

1.注册UDF

   add jar /jar目录

2.创建临时函数

   create temporary function getNation(调用的函数名) as 'cn.hive.udf.NationUDF'(对应的函数)

4.执行列子

   select id,name,getNation(nation) from people ;

相关内容