Hive学习(部分参考厦门大学林子雨老师的课程)

HIVE介绍

参考
1、Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析。
2、Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
使用 hive 的命令行接口,感觉很像操作关系数据库,但是 hive 和关系数据库还是有很大的不同,下面我就比较下 hive 与关系数据库的区别,具体如下:

  1. Hive 和关系数据库存储文件的系统不同,Hive 使用的是 hadoop 的 HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
  2. hive 使用的计算模型是 mapreduce,而关系数据库则是自己设计的计算模型;
  3. 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive的应用场景和关系数据库有很大的不同;

Hive 很容易扩展自己的存储能力和计算能力,这个是继承 hadoop 的,而关系数据库在这个方面要比数据库差很多。

一、安装Hive

我们已经安装好了Hadoop分布式文件系统
Hive下载链接

sudo tar -zxvf ./apache-hive-1.2.1-bin.tar.gz -C /usr/local   # 解压到/usr/local中
cd /usr/local/
sudo mv apache-hive-1.2.1-bin hive       # 将文件夹名改为hive
sudo chown -R hadoop:hadoop hive            # 修改文件权限
vim ~/.bashrc

添加如下:

export HIVE_HOME=/usr/local/hive
export PATH= P A T H : HIVE_HOME/bin
export HADOOP_HOME=/usr/local/hadoop

source ~/.bashrc

二、安装Mysql

采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。

三、Hive操作

1、Hive的一些常用命令

创建数据库

create database if not exists my_base;

数据库里有表格 my_table

show databases; //列出数据库

describe database my_base; // 展示数据库 my_base的信息

use my_base; // 使用某个数据库 my_base

set hive.cli.print.current.db=true; 显示列头
set hive.cli.print.current.db=false; 关闭列头

show tables; // 展示这个数据库里面的所有表格

show tables in my_base; // 展示数据库 fm_data 里面的所有表格

show tables like 'm.*'; // 通配符 模糊查找,以m开头

show create table my_table; // 获得表格 my_table的建表语句,其中包括表格的字段,HDFS 的 location 等信息

describe my_table; // 展示表格 my_table的字段以及字段类型

describe formatted my_table; // 详细描述表格 my_table,包括表格的结构,所在的 database,owner,location,表格的类型 (Managed Table or External Table),存储信息等

一些基本操作:

把目录 /usr/local/data 下的数据文件中的数据装载到usr表并覆盖原有的数据:

hive> load data local inpath '/usr/local/data' overwrite into table usr;

向表usr1中插入来自usr表的数据并覆盖原有数据:

hive> insert overwrite table usr1
    > select * from usr where age=10;

向表usr1中插入来自usr表的数据并追加在原有数据:后

hive> insert into table usr1
    > select * from usr where age=10;

2、内部表与外部表

Hive 的表格分两种,一种是 managed tables(内部表),另一种是 external tables(外部表)。Hive 创建表格时,默认创建的是 managed table,这种表会把数据移动到自己的数据仓库目录下;另外一种是 external tables,它关联的数据不是 Hive 维护的,也不在 Hive 的数据仓库内。

创建内部表格和外部表格:

create table test(name string);
create external table test(name string);  //创建外部表格需要加上external;

修改表属性:

alter table test set tblproperties (‘EXTERNAL’=’TRUE’); 内部表转外部表
alter table test set tblproperties (‘EXTERNAL’=’FALSE’); 外部表转内部表

归纳一下Hive中表与外部表的区别:

  1. 在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;

  2. 在删除内部表的时候,Hive 将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive 仅仅删除外部表的元数据,数据是不会删除的!换言之,内部表 DROP 时会删除 HDFS 上的数据;外部表 DROP 时不会删除 HDFS 上的数据。

  3. 在创建内部表或外部表时加上 location 的效果是一样的,只不过表目录的位置不同而已,加上 partition 用法也一样,只不过表目录下会有分区目录而已,load data local inpath 直接把本地文件系统的数据上传到 hdfs 上,有 location 上传到 location 指定的位置上,没有的话上传到 hive 默认配置的数据仓库中。

  4. 使用场景:内部表:HIVE 中间表,结果表,一般不需要从外部(如本地文件,HDFS 上 load 数据)的情况;外部表:源表,需要定期将外部数据映射到表格中。

3、创建表

创建表:

create table test1 like test; 只是复制了表的结构,并没有复制内容;
create table test2 as select name from test; 从其他表格查询,再创建表格;

例子:创建一张表my_table

CREATE EXTERNAL TABLE my_table(   
id INT, 
ip STRING COMMENT 'Visitor ip',    
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT 'my table'
PARTITIONED BY (day STRING)       
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' 
STORED AS textfile
LOCATION '/usr/local/hadoop/examples/input';

关键字说明:

  1. 关键字 EXTERNAL:表示该表为外部表,如果不指定EXTERNAL关键字,则表示内部表
  2. 关键字 COMMENT:为表和列添加注释
  3. 关键字 PARTITIONED BY:表示该表为分区表,分区字段为day,类型为string
  4. 关键字 ROW FORMAT DELIMITED:指定表的分隔符,通常后面要与以下关键字连用:
    FIELDS TERMINATED BY ‘,’ //指定每行中字段分隔符为逗号
    LINES TERMINATED BY ‘\n’ //指定行分隔符 COLLECTION
    ITEMS TERMINATED BY ‘,’ //指定集合中元素之间的分隔符
    MAP KEYS TERMINATED BY ‘:’ //指定数据中 Map 类型的 Key 与 Value 之间的分隔符
  5. 关键字 STORED AS:指定表在 HDFS 上的文件存储格式,可选的文件存储格式有:
    TEXTFILE //文本,默认值
    SEQUENCEFILE // 二进制序列文件
    ORC//列式存储格式文件,比 RCFILE 有更高的压缩比和读写效率,Hive0.11以后开始支持
    PARQUET //列出存储格式文件,Hive0.13以后开始支持
  6. 关键词 LOCATION:指定表在HDFS上的存储位置。

注:hive 建表的时候默认的分隔符是’\001’,如果建表的时候没有指定分隔符,load文件的时候的分隔符是’\001’。如果需要在建表的时候指定分隔符,需要如下操作:
create table pokes(foo int,bar string)
row format delimited fields terminated by ‘\t’ lines terminated by ‘\n’ stored as textfile;
load data local inpath ‘/root/pokes.txt’ into table pokes;

4、修改表格

alter table my_table add columns ( reporttime STRING COMMENT '上报日期时间'); //为表格增加列

alter table test rename to test2;  // 修改表名

alter table test add partition (day=20160301); //增加分区

alter table test drop partition (day=20160301); //删除分区

alter table test partition (day=20160301) rename to partition (day=20160302); //修改分区

load data local inpath ‘/liguodong/hivedata/datatest’ overwrite into table test;  // 从文件加载数据:覆盖原来数据

load data local inpath ‘/liguodong/hivedata/datatest’ into table test; // 从文件加载数据:添加数据

insert overwrite directory ‘tmp/csl_rule_cfg’ select a.* from test a; // 导出数据到文件

5、查询和分析数据

dfs -ls /user/hive/warehouse/hive.db/my_table // 查看 hdfs 文件信息

set hive.cli.print.header=true;  //显示列名称

set hive.cli.print.header=false; //不显示列名称

(I)基本操作

假设表格 my_table的格式是:owner (string), key (string), value (int), day (bigint)

select * from my_table;  //查找数据

select * from my_table limit 10; //查找前10行数据

select * from my_table where day=20160301; //查询day=20160301的数据

select * from my_table where day >= 20160301 and day <= 20160302;

select * from my_table where day >= 20160301 or day <= 20160302;

select * from my_table where day=20160301 order by value; //查找出来后按照value的值升序排列

select * from my_table where day=20160301 order by value desc; //查找出来后按照value的值降序排列

insert [overwrite] into table my_table partition (day=20160301) values (‘20032′,’key_20032’,1.0) // 不使用overwrite是往表格里追加一条数据,如果使用overwrite就是覆盖整个表格。

(II)高级操作

select * from my_table where day between 20160301 and 20160302; //查询表格中从20160301到20160302的数据

JOIN 操作:

  • inner join: 在表格中至少存在一个匹配时,inner join 的关键字返回行;注:inner join 和 join是相同的。
  • left join: 会从左边的表格返回所有的行,即使在右边的表格中没有匹配的行。
  • right join:会从右边的表格返回所有的行,即使在左边的表格中没有匹配的行。
  • full join:只要其中的一张表存在匹配,full join 就会返回行。在某些数据库中,full join 也称作 full outer join。
  • union:用于合并两个或者多个 select 语句的结果集。
  • is NULL & is not NULL:来判断某个字段是否是空集。

(III)聚合函数

group by:通常和聚合函数一起使用,根据一个或者多个列对结果进行分组
常见的聚合函数有:

AVG:返回数列值的平均值
COUNT:返回一列值的数目
MAX/MIN:返回一列值的最大值/最小值
SUM:返回数列值的总和

(IV)数值函数

MOD(x,y):取模 x%y
ln(double a):返回给定数值的自然对数
power(double a, double b):返回某数的乘幂
sqrt(double a):开平方
sin/cos/asin/acos:三角函数

四、林子雨老师的课程

create database if not exists hive;      //在运行下面的程序时需要先创建数据库
create table if not exists hive.usr(
       name string comment 'username',
       pwd string comment 'password',
       address struct<street:string,city:string,state:string,zip:int>  //注意:原文中最后有一个逗号,会报错
       comment  'home address',
       identify map<int,tinyint> comment 'number,sex') 
       comment 'description of the table'  
       tblproperties('creator'='me','time'='2016.1.1');
create external table if not exists hive.usr2(      //注意:需要hive.usr2,原文中没有hive. 不然后续的会报错
       name string,
       pwd string,
       address struct<street:string,city:string,state:string,zip:int>,
       identify map<int,tinyint>) 
       row format delimited fields terminated by ','
       location '/usr/local/hive/warehouse/hive.db/usr';
create table if not exists hive.usr3(                     //注意:需要hive.usr3,原文中没有hive. 不然后续的会报错
       name string,
       pwd string,
       address struct<street:string,city:string,state:string,zip:int>,
       identify map<int,tinyint>) 
       partitioned by(city string,state string); 

猜你喜欢

转载自blog.csdn.net/Stars_Zhang/article/details/81668725