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的官方文档中,找到所有的函数。

HiveRHive的基本操作对比:

#连接到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在金融背景下的大数据的案例。

results matching ""

    No results matching ""