您的位置:首页 > 其它

Hive学习心得&Hive的UDF

2015-02-16 10:29 344 查看
一: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 ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: