hive学习总结

目录

一:启动hive

二:基本操作

三:查询操作

四.连接操作

五. hive简单编程实践-- wordcount


一:启动hive

       注意启动hive之前请启动Hadoop

如何启动Hadoop

cd /usr/local/hadoop/sbin     #进入相关目录下面
./start-dfs.sh                #判断是否启动成功使用jps

启动hive:

cd /usr/local/hive
./bin/hive

二:基本操作

创建数据库

create table if not exists hive;

#查看数据库
show databases;

# 查看数据库中以h开头的数据库
show databases like 'h.*';

# 描述数据库位置等信息
describe databases;

# 使用某个数据库
use name;

创建表

create table if not exists usr3(
      name string,
      pwd string,
      address struct<street:string,city:string,state:string,zip:int>,
      identify map<int,tinyint>) 
      partitioned by(city string,state string);
# 展示所有表
show tables in hive;

# 查看以u开头的表
show tables 'u.*';

#查看表的相关信息
describe hive.usr;

#重命名表
alter table usr rename to custom 

向表中装载数据

这里我们以只有两个属性的简单表为例来介绍。首先创建表stu和course,

stu有两个属性id与name,course有两个属性cid与sid。

create table if not exists hive.stu(id int,name string)
row format delimited fields terminated by '\t';
create table if not exists hive.course(cid int,sid int)
row format delimited fields terminated by '\t';

向表中装载数据有两种方法:从文件中导入和通过查询语句插入。

a).从文件中导入

假如这个表中的记录存储于文件stu.txt中,该文件的存储路径为/usr/local/hadoop/examples/stu.txt,内容如下。

stu.txt:

1 xiapi 
2 xiaoxue 
3 qingqing

下面我们把这个文件中的数据装载到表stu中,操作如下:

load data local inpath '/usr/local/hadoop/examples/stu.txt' overwrite into table stu;

如果stu.txt文件存储在HDFS 上,则不需要 local 关键字。

b).通过查询语句插入

使用如下命令,创建stu1表,它和stu表属性相同,我们要把从stu表中查询得到的数据插入到stu1中:

create table stu1 as select id,name from stu;

上面是创建表,并直接向新表插入数据;若表已经存在,向表中插入数据需执行以下命令:

insert overwrite table stu1 select id,name from stu where(条件);

这里关键字overwrite的作用是替换掉表(或分区)中原有数据,换成into关键字,直接追加到原有内容后。

三:查询操作

和sql的查询完全一样。主要使用select  ... from ... where等语句

再结合关键字group by ,having ,like, rlike等操作。

hive中新增的一部分语句有:case ... when ... then ...句式,join操作和子查询操作

case... when ... then 语句和if语句类似,用于处理单个列的查询操作

语法:

select id , name,
    case 
    when id =1 then 'first'
    when id =2 then 'second'
    else 'third'

四.连接操作


连接(join)是将两个表中在共同数据项上相互匹配的那些行合并起来, HiveQL 的连接分为内连接、

左向外连接、右向外连接、全外连接和半连接 5 种。

a. 内连接(等值连接)
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

首先,我们先把以下内容插入到course表中(自行完成)。

1 3
2 1
3 1

下面, 查询stu和course表中学号相同的所有行,命令如下:


select stu.*, course.* from stu join course on(stu .id=course .sid);

执行结果如下:

hive学习总结

b. 左连接
左连接的结果集包括“LEFT OUTER”子句中指定的左表的所有行,

而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,

则在相关联的结果集中右表的所有选择列均为空值,命令如下:

select stu.*, course.* from stu left outer join course on(stu .id=course .sid);

执行结果如下:

hive学习总结

c. 右连接
右连接是左向外连接的反向连接,将返回右表的所有行。

如果右表的某行在左表中没有匹配行,则将为左表返回空值。命令如下:

select stu.*, course.* from stu right outer join course on(stu .id=course .sid);

执行结果如下:

hive学习总结

d. 全连接
全连接返回左表和右表中的所有行。当某行在另一表中没有匹配行时,

则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。命令如下:

select stu.*, course.* from stu full outer join course on(stu .id=course .sid);

执行结果如下:

hive学习总结

e. 半连接
半连接是 Hive 所特有的, Hive 不支持 in 操作,但是拥有替代的方案;

left semi join, 称为半连接, 需要注意的是连接的表不能在查询的列中,只能出现在 on 子句中。命令如下:

select stu.* from stu left semi join course on(stu .id=course .sid);

执行结果如下:

hive学习总结

子查询
标准 SQL 的子查询支持嵌套的 select 子句,HiveQL 对子查询的支持很有限,只能在from 引导的子句中出现子查询。

注意,在定义或是操作表时,不要忘记指定所需数据库。

五. hive简单编程实践-- wordcount

1)创建input目录,output目录会自动生成。其中input为输入目录,output目录为输出目录。命令如下:

cd /usr/local/hadoop
mkdir input

2)然后,在input文件夹中创建两个测试文件file1.txt和file2.txt,命令如下:


cd /usr/local/hadoop/input
echo "hello world" > file1.txt
echo "hello hadoop" > file2.txt

3)下面我们通过HiveQL实现词频统计功能,此时只要编写下面7行代码,

而且不需要进行编译生成jar来执行。HiveQL实现命令如下:

create table docs(line string);
load data inpath 'file:///usr/local/hadoop/input' overwrite into table docs;
create table word_count as
select word, count(1) as count from
(select explode(split(line,' '))as word from docs) w
group by word
order by word;

执行后,用select语句查看,结果如下:

hive学习总结

由上可知,采用Hive实现最大的优势是,对于非程序员,不用学习编写Java MapReduce代码了,

只需要用户学习使用HiveQL就可以了,而这对于有SQL基础的用户而言是非常容易的。

 

参考文献:

http://dblab.xmu.edu.cn/blog/2440-2/

 

 

上一篇:30-课程详情页之后台


下一篇:分数的统计