一、Hive初识
1.Hive的安装,前面的博客中已经介绍过,这里就不再赘述了
2.Hive的基本语法
查看Hive中有多少数据库:show databases;
创建一个数据库:create database 数据库名;
创建一个数据表:create table 表名(字段 数据类型,字段 数据类型........)row format delimited fields terminated by ' ';
查看某个数据库中有多少表:先进入该数据库下,命令是 use 数据库名,然后,show tables;
查看某个表的信息:desc 表名;
查看某个表的详细信息:desc extended 表名;
格式化查看某个表的详细信息:desc formatted 表名;
查看数据库中有哪些函数:show functions;
查看数据库中某个函数:desc function 函数名;
详细查看数据库中某个函数:desc function extended 函数名;
模糊查找某个数据库:show databases like 'db_hive*';
查看某个数据库的信息:desc database 数据库名;
查看某个数据库的详细信息: desc database extended 数据库名;
删除空的数据库(里面已经没有数据表了):drop database 数据库名;
删除数据库:drop database 数据库名 cascade;
标准删除数据库:drop database if exists 数据库名;
清空表中的数据:truncate table 表名;
创建一个与已有表结构相同的表:create table if not exists 新表名 like 旧表名;
给表重命名:alter table 旧表名 rename to 新表名;
标准删除表:drop table if exists 表名;
创建一张表的时候,就直接将已有表的某些字段信息加载进表中:create table if not exists 数据库名.新表名 AS select 字段1,字段2 .... from 数据库名.旧表名;
3.Hive的高级语法
bin/hive -e SQL语句
例如:bin/hive -e "select * from 数据库名.表名;"
bin/hive -f SQL脚本
例如:touch hivef.sql
select * from 数据库名.表名
bin/hive -f /opt/datas/hivef.sql
bin/hive -f /opt/datas/hivef.sql > /opt/datas/hivef-res.txt
在hive cli命令窗口中如何查看hdfs文件系统
hive (default)> dfs -ls / ;
在hive cli 命令窗口中如何查看本地文件系统
hive (default) > !ls /opt/datas;
二、Hive的深入
1.创建一张表(默认是管理表),默认存储,并将本地的数据加载进表
格式:create table if not exists 数据库名.表名(
字段 数据类型,
字段 数据类型
)
row format delimited fields terminated by ' ';
load data local inpath '/opt/datas/data.txt' into table 数据库名.表名;
2.创建一张外部表(托管表),默认存储,并将本体的数据加载进表
格式:create external table if not exists 数据库名.表名(
字段 数据类型,
字段 数据类型
)
row format delimited fields terminated by ' '
location '/user/xunzhang/hive/warehouse/biaoming';
dfs -put /opt/datas/data.txt /user/xunzhang/hive/warehouse/;
注意:这里的location 后面的hdfs路径,一定要先创建出来,数据可以先上传,也可以后上传
3.创建一张分区表,默认存储,并将本地的数据加载进表
格式:create external table if not exists 数据库名.表名(
字段 数据类型,
字段 数据类型
)
partitioned by ( mouth (字段一) 数据类型,day (字段二) 数据类型)
row format delimited fields terminated by ' ';
load data local inpath '/opt/datas/data.txt' into table 数据库名.表名 partition (字段一=... ,字段二 =.... );
注意:
查表之前:msck repair table 数据库名.表名 或者 alter table 数据库名.表名 add partition (字段一=... ,字段二 =.... ) ;
这时候查找就变成这样:
select * from 数据库名.表名 where 字段一 = ... and 字段二 = ....;
4、总结
将文件数据加载进Hive表中的几种方法
1>加载本地文件到hive表
load data local inpath '/opt/datas/data.txt' (overwrite) into table 数据库名.表名;
2>加载hdfs文件到hive表中
load data inpath '/opt/datas/data.txt' (overwrite) into table 数据库名.表名;
或者
import table 数据库名.表名 from '/user/xunzhang/hive/data.txt';
3>创建表时,通过insert 加载
create table 数据库名.新表名 like 数据库名.旧表名;
insert into table 数据库名.新表名 select * from 数据库名.旧表名;
4>如果是外部表,创建表的时候通过location指定加载
将hive表中的数据导出的几种方法
1>将hive表中的数据导到本地
insert overwrite local directory '/opt/datas/data.txt'
row format delimited fields terminated by ' ' collection items terminated by ' '
select * from 数据库名.表名;
或者
bin/hive -e "select * from 数据库名.表名;" > /opt/datas/data.txt
2>将hive表中的数据导到hdfs上
insert overwrite directory '/user/xunzhang/hive/data.txt'
row format delimited fields terminated by ' ' collection items terminated by ' '
select * from 数据库名.表名;
或者
export table 数据库名.表名 to '/user/xunzhang/hive/data.txt';
三、Hive高级
1.hive表中数据的存储方式
常见有三种,分别是:orc , parquet , textfile ,存储相同的数据,orc占的空间最少,但查询最慢,textfile占的空间最大,但查询最快
1> textfile方式
create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE ;
load data local inpath '/opt/datas/page_views.data' into table page_views ;
dfs -du -h /user/hive/warehouse/page_views/ ;
18.1 M /user/hive/warehouse/page_views/page_views.data
2> orc方式
create table page_views_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS orc ;
insert into table page_views_orc select * from page_views ;
dfs -du -h /user/hive/warehouse/page_views_orc/ ;
2.6 M /user/hive/warehouse/page_views_orc/000000_0
3>parquet方式
create table page_views_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS PARQUET ;
insert into table page_views_parquet select * from page_views ;
dfs -du -h /user/hive/warehouse/page_views_parquet/ ;
13.1 M /user/hive/warehouse/page_views_parquet/000000_0
2.hive表中的数据压缩存储
最常见的压缩方式是:snappy压缩,hadoop本身是不支持压缩的,如果要想压缩存储,需要重新编译源码,这里我不做过多的介绍,这里面比较复杂
1>snappy 压缩的三种方式
create table page_views_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS orc tblproperties ("orc.compress"="SNAPPY");
insert into table page_views_orc_snappy select * from page_views ;
dfs -du -h /user/hive/warehouse/page_views_orc_snappy/ ;
或者
set parquet.compression=SNAPPY ;
create table page_views_parquet_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS parquet;
insert into table page_views_parquet_snappy select * from page_views ;
dfs -du -h /user/hive/warehouse/page_views_parquet_snappy/ ;
或者
set parquet.compression=SNAPPY ;
create table page_views_par_snappy
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS parquet
AS select * from page_views ;
dfs -du -h /user/hive/warehouse/page_views_par_snappy/ ;
3. udf 编程
1>将编写好的udf程序打成一个jar包,比如jar包是:hiveudf.jar
2>在hive cli 命令行:
add jar /opt/datas/hiveudf.jar;
3>在hive cli 命令行,创建临时函数
命令:
create temporary function 函数名(自己定义) as "com.beifeng.senior.hive.udf.RemoveQuotesUDF"(jar包中class文件路径) ;
4>使用临时函数,将处理好的数据重新加载进hive表
命令:
insert overwrite table default.bf_log_comm select my_removequotes(remote_addr), my_removequotes(time_local), my_removequotes(request), my_removequotes(http_referer) from default.bf_log_src ;
5>检查是否成功
命令:
select * from bf_log_comm limit 5 ;
四、实战
1、数据下载链接:
http://files.grouplens.org/datasets/movielens/ml-100k.zip
或者
http://files.grouplens.org/datasets/movielens/ml-100k.zip
2.代码展示
1 CREATE TABLE u_data_new ( 2 userid INT, 3 movieid INT, 4 rating INT, 5 weekday INT) 6 ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '; 7 8 add FILE /opt/datas/ml-100k/weekday_mapper.py; 9 10 INSERT OVERWRITE TABLE u_data_new 11 SELECT 12 TRANSFORM (userid, movieid, rating, unixtime) 13 USING 'python weekday_mapper.py' 14 AS (userid, movieid, rating, weekday) 15 FROM u_data; 16 17 SELECT weekday, COUNT(*) FROM u_data_new GROUP BY weekday; 18 19 SELECT weekday, COUNT(1) cnt FROM u_data_new GROUP BY weekday order by cnt desc; 20 21 // weekday_mapper.py里面的内容如下: 22 import sys 23 import datetime 24 25 for line in sys.stdin: 26 line = line.strip() 27 userid, movieid, rating, unixtime = line.split(' ') 28 weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() 29 print ' '.join([userid, movieid, rating, str(weekday)])