6.5 R利剑NoSQL 之 Hive
问题
R如何连接Hive?
引言
Hive是Hadoop的一个程序接口,使用了类SQL的语法,数据分析人员可以快速掌握。Hive让Java的世界变得简单而轻巧,让Hadoop普及到了程序员以外的人。从Hive开始,分析师们也能玩转大数据。本节将介绍rhive,让R程序轻松连接Hive。
6.5.1 Hive环境准备
Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。Hive 没有专门的数据格式, 可以很好地工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。
Hive与关系数据库的区别:
- 数据存储不同:Hive基于Hadoop的HDFS,关系数据库则基于本地文件系统
- 计算模型不同:Hive基于Hadoop的mapreduce,关系数据库则基于索引的内存计算模型
- 应用场景不同:Hive是OLAP数据仓库系统提供海量数据查询的,实时性很差;关系数据库是OLTP事务系统,为实时查询业务服务
- 扩展性不同:Hive基于Hadoop很容易通过分布式增加存储能力和计算能力,关系数据库水平扩展很难,要不断增加单机的性能
Hive是基于Hadoop开发的数据仓库产品,所以首先我们要先有Hadoop的环境。关于Hive的安装和配置,请参考附录G。
首先环境准备,这里我选择了Linux Ubuntu操作系统,大家可以根据自己的使用习惯选择顺手的Linux。
- • Linux Ubuntu 12.04.2 LTS 64bit server • Java JDK 1.6.0_45 • Hadoop 1.1.2 • hive 0.9.0 • IP: 192.168.1.210
Hive安装好后,启动hiveserver的服务
# 通过nohup在后台启动hiveserver服务。
~ nohup hive --service hiveserver &
Starting Hive Thrift Server
Hive Shell的简单操作:
# 打开hive shell
~ hive shell
Logging initialized using configuration in file:/home/conan/hadoop/hive-0.9.0/conf/hive-log4j.proper ties
Hive history file=/tmp/conan/hive_job_log_conan_201306261459_153868095.txt
#查看hive的表
hive> show tables;
hive_algo_t_account
o_account
r_t_account
Time taken: 2.12 seconds
#查看o_account表的数据
hive> select * from o_account;
1 abc@163.com 2013-04-22 12:21:39
2 dedac@163.com 2013-04-22 12:21:39
3 qq8fed@163.com 2013-04-22 12:21:39
4 qw1@163.com 2013-04-22 12:21:39
5 af3d@163.com 2013-04-22 12:21:39
6 ab34@163.com 2013-04-22 12:21:39
7 q8d1@gmail.com 2013-04-23 09:21:24
8 conan@gmail.com 2013-04-23 09:21:24
9 adeg@sohu.com 2013-04-23 09:21:24
10 ade121@sohu.com 2013-04-23 09:21:24
11 addde@sohu.com 2013-04-23 09:21:24
Time taken: 0.469 seconds
6.5.2 RHive安装
接下来,我们在装有Hive的同一台机器上装RHive。
客户端环境
- Linux: Ubuntu 12.04.2 LTS 64bit server
- R: 3.0.1, x86_64-pc-linux-gnu (64-bit)
注:RHive只支持Linux环境
首先,安装R依赖库rjava。
~ sudo R CMD javareconf # 建议使用root权限安装rJava
~ sudo R # 启动R程序
> install.packages("rJava")
> install.packages("RHive") # 安装RHive
> library(RHive) # 加载RHive
Loading required package: rJava
Loading required package: Rserve
This is RHive 0.0-7. For overview type ‘?RHive’.
HIVE_HOME=/home/conan/hadoop/hive-0.9.0
call rhive.init() because HIVE_HOME is set.
加载RHive时,本地Hive的环境变量,都会自动加载到R语言的运行时环境中。
6.5.3 RHive函数库
RHive提供了52个函数,对应Hive的操作。我们不一一列出所有RHive函数库,仅挑选一些常用的函数与Hive操作进行对比。感兴趣的读者可以从RHive的官方文档中,找到所有的函数。
Hive和RHive的基本操作对比:
#连接到hive
Hive:
hive shell
RHive:
rhive.connect("192.168.1.210")
#列出所有hive的表
Hive:
show tables;
RHive:
rhive.list.tables()
#查看表结构
Hive:
desc o_account;
RHive:
rhive.desc.table('o_account')
rhive.desc.table('o_account',TRUE)
#执行HQL查询
Hive:
select * from o_account;
RHive:
rhive.query('select * from o_account')
#查看hdfs目录
Hive:
dfs -ls /;
RHive:
rhive.hdfs.ls()
#查看hdfs文件内容
Hive:
dfs -cat /user/hive/warehouse/o_account/part-m-00000;
RHive:
rhive.hdfs.cat('/user/hive/warehouse/o_account/part-m-00000')
#断开连接
Hive:
quit;
RHive:
rhive.close()
6.5.4 RHive基本使用操作
> rhive.init() #初始化
> rhive.connect("192.168.1.210") #连接hive
> rhive.list.tables() #查看所有表
tab_name
1 hive_algo_t_account
2 o_account
3 r_t_account
> rhive.desc.table('o_account'); #查看表结构
col_name data_type comment
1 id int
2 email string
3 create_date string
> rhive.query("select * from o_account"); #执行HQL查询
id email create_date
1 1 abc@163.com 2013-04-22 12:21:39
2 2 dedac@163.com 2013-04-22 12:21:39
3 3 qq8fed@163.com 2013-04-22 12:21:39
4 4 qw1@163.com 2013-04-22 12:21:39
5 5 af3d@163.com 2013-04-22 12:21:39
6 6 ab34@163.com 2013-04-22 12:21:39
7 7 q8d1@gmail.com 2013-04-23 09:21:24
8 8 conan@gmail.com 2013-04-23 09:21:24
9 9 adeg@sohu.com 2013-04-23 09:21:24
10 10 ade121@sohu.com 2013-04-23 09:21:24
11 11 addde@sohu.com 2013-04-23 09:21:24
> rhive.close() #关闭连接
[1] TRUE
> rhive.block.sample('o_account', subset="id<5") #创建临时表
[1] "rhive_sblk_1372238856"
> rhive.query("select * from rhive_sblk_1372238856"); #查看临时表
id email create_date
1 1 abc@163.com 2013-04-22 12:21:39
2 2 dedac@163.com 2013-04-22 12:21:39
3 3 qq8fed@163.com 2013-04-22 12:21:39
4 4 qw1@163.com 2013-04-22 12:21:39
> rhive.hdfs.ls('/user/hive/warehouse/rhive_sblk_1372238856/') #查看hdfs的文件
permission owner group length modify-time
1 rw-r--r-- conan supergroup 141 2013-06-26 17:28
file
1 /user/hive/warehouse/rhive_sblk_1372238856/000000_0
> rhive.hdfs.cat('/user/hive/warehouse/rhive_sblk_1372238856/000000_0')
1abc@163.com2013-04-22 12:21:39
2dedac@163.com2013-04-22 12:21:39
3qq8fed@163.com2013-04-22 12:21:39
4qw1@163.com2013-04-22 12:21:39
> rhive.basic.cut('o_account','id',breaks='0:100:3') #按范围分割字段数据
[1] "rhive_result_20130626173626"
attr(,"result:size")
[1] 443
> rhive.query("select * from rhive_result_20130626173626");
email create_date id
1 abc@163.com 2013-04-22 12:21:39 (0,3]
2 dedac@163.com 2013-04-22 12:21:39 (0,3]
3 qq8fed@163.com 2013-04-22 12:21:39 (0,3]
4 qw1@163.com 2013-04-22 12:21:39 (3,6]
5 af3d@163.com 2013-04-22 12:21:39 (3,6]
6 ab34@163.com 2013-04-22 12:21:39 (3,6]
7 q8d1@gmail.com 2013-04-23 09:21:24 (6,9]
8 conan@gmail.com 2013-04-23 09:21:24 (6,9]
9 adeg@sohu.com 2013-04-23 09:21:24 (6,9]
10 ade121@sohu.com 2013-04-23 09:21:24 (9,12]
11 addde@sohu.com 2013-04-23 09:21:24 (9,12]
Hive操作HDFS
> rhive.hdfs.ls() #查看hdfs文件目录
permission owner group length modify-time file
1 rwxr-xr-x conan supergroup 0 2013-04-24 01:52 /hbase
2 rwxr-xr-x conan supergroup 0 2013-06-23 10:59 /home
3 rwxr-xr-x conan supergroup 0 2013-06-26 11:18 /rhive
4 rwxr-xr-x conan supergroup 0 2013-06-23 13:27 /tmp
5 rwxr-xr-x conan supergroup 0 2013-04-24 19:28 /user
> rhive.hdfs.cat('/user/hive/warehouse/o_account/part-m-00000') #查看hdfs文件内容
1abc@163.com2013-04-22 12:21:39
2dedac@163.com2013-04-22 12:21:39
3qq8fed@163.com2013-04-22 12:21:39
通过RHive我们就打通了R和Hive的数据通道,可以用R来实现基于Hive系统的大数据的操作。下一节中,我会介绍RHive在金融背景下的大数据的案例。