参考
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 与关系数据库的区别,具体如下:
Hive 很容易扩展自己的存储能力和计算能力,这个是继承 hadoop 的,而关系数据库在这个方面要比数据库差很多。
我们已经安装好了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= PATH: P A T H : HIVE_HOME/bin
export HADOOP_HOME=/usr/local/hadoop
source ~/.bashrc
采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。
创建数据库
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;
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中表与外部表的区别:
在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
在删除内部表的时候,Hive 将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive 仅仅删除外部表的元数据,数据是不会删除的!换言之,内部表 DROP 时会删除 HDFS 上的数据;外部表 DROP 时不会删除 HDFS 上的数据。
在创建内部表或外部表时加上 location 的效果是一样的,只不过表目录的位置不同而已,加上 partition 用法也一样,只不过表目录下会有分区目录而已,load data local inpath 直接把本地文件系统的数据上传到 hdfs 上,有 location 上传到 location 指定的位置上,没有的话上传到 hive 默认配置的数据仓库中。
使用场景:内部表:HIVE 中间表,结果表,一般不需要从外部(如本地文件,HDFS 上 load 数据)的情况;外部表:源表,需要定期将外部数据映射到表格中。
创建表:
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';
关键字说明:
注: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;
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; // 导出数据到文件
dfs -ls /user/hive/warehouse/hive.db/my_table // 查看 hdfs 文件信息
set hive.cli.print.header=true; //显示列名称
set hive.cli.print.header=false; //不显示列名称
假设表格 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就是覆盖整个表格。
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
:来判断某个字段是否是空集。group by
:通常和聚合函数一起使用,根据一个或者多个列对结果进行分组
常见的聚合函数有:
AVG:返回数列值的平均值
COUNT:返回一列值的数目
MAX/MIN:返回一列值的最大值/最小值
SUM:返回数列值的总和
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 structstring,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 structstring,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 structstring,city:string,state:string,zip:int>,
identify map<int,tinyint>)
partitioned by(city string,state string);