Hive数据仓库的具体操作

一、建库建表

1、建库

hive> create database 库名;

举例:

hive> create database staff;

2、建表(类似MySQL)
(1)使用create命令创建一个新表

hive> create table 表名(字段名 字段类型, ……) row format delimited fields terminated by '分隔符';

举例:

hive> create table t1(eid int, name string, sex string) row format delimited fields terminated by '\t';

(2)把一张表的某些字段抽取出来,创建成一张新表(as),例如:

hive> create table backup_track_log as select * from company.track_log;

注意:会复制属性以及属性值到新的表中
(3)复制表结构(like),例如:

hive> create table like_track_log like company.track_log;

注意:不会复制属性值,只会复制表结构。

3、删表

hive> drop table 表名;

4、查看表的详细信息

hive> desc formatted 表名;

举例:

hive > desc formatted t1;

二、导入数据(load)

1、从本地导入

load data local inpath '文件路径' into table 表名;

举例:

load data local inpath '/opt/modules/cdh5.3.6/hive-0.13.1-cdh5.3.6/staff.txt' into table staff.t1;

若Hive默认的存储路径为:/user/hive/warehouse,则数据存储到以下路径:
/user/hive/warehouse/staff.db/t1

2、从HDFS系统导入

load data inpath 'HDFS上的文件路径' into table 表名;

3、覆盖导入

load data local inpath 'path/file' overwrite into table 表名称 ;
load data inpath 'path/file' overwrite into table 表名称 ;

4、查询导入
同as方式建表:

create table track_log_bak as select * from company.track_log;

5、insert导入

insert into table 表名 select * from track_log;

6、覆盖导入

insert overwrite table 表名 select * from track_log;

注意:若这里不指定overwrite,则默认为append/追加。

三、导出数据

1、本地导出,例如:

insert overwrite local directory "/home/admin/Desktop/1/2" row format delimited fields terminated by '\t' select * from company.emp ;

注意:会递归创建目录
2、HDFS导出,例如:

insert overwrite diretory "path/" select * from staff;

3、Bash脚本覆盖追加导出,例如:

bin/hive -e "select * from staff;"  > /home/z/backup.log

4、Sqoop
具体见sqoop操作

三、Hive元数据库的备份与还原

1、备份
方式1:命令行操作

mysqldump -uroot -p metastore > metastore.sql

方式2:数据库的管理工具(例如:Navicat)操作

2、还原

mysql -uroot -p metastore < metastore.sql

四、未登录Hive情况下执行HQL语句

bin/hive -e "hql语句"
bin/hive -f 文件.hql

五、Hive临时生效设置

set 属性名=属性值

例如:临时设置表头不显示

set hive.cli.print.header=false;

六、指定表存放的位置:location

例如:建一张customer表,放在“/user/hive/warehouse/customer”的目录下:

hive> CREATE TABLE customer(id int, name string)  location '/user/hive/warehouse/customer'

七、Hive的内部表与外部表

1、默认情况:inner,不要加INNER关键字,否则报错

hive> CREATE TABLE 表名;

2、显示指定外部表:external

hive> CREATE EXTERNAL TABLE 表名;

3、内部表与外部表的相同之处及不同之处

内部表与外部表相同之处:如果你导入数据时,操作于HDFS上,则会将数据进行迁移,并在metastore留下记录,而不是copy数据源。

不同之处在于:内部表删除表数据时,连同数据源以及元数据信息同时删除,而外部表只会删除元数据信息(即metastore中的数据)。所以在共享数据方面,外部表相对而言也更加方便和安全。

八、Hive分区表

把数据导入至一张表,用分区区分。

第一步:创建分区表
关键词:partitioned by(字段 字段类型 , ……)
举例:

create database if not exists company;
create table if not exists company.track_log(
id              string,
url            string,
referer        string,
keyword        string,
type            string,
guid            string,
pageId          string,
moduleId        string,
linkId          string,
attachedInfo    string,
sessionId      string,
trackerU        string,
trackerType    string,
ip              string,
trackerSrc      string,
cookie          string,
orderCode      string,
trackTime      string,
endUserId      string,
firstLink      string,
sessionViewNo  string,
productId      string,
curMerchantId  string,
provinceId      string,
cityId          string,
fee            string,
edmActivity    string,
edmEmail        string,
edmJobId        string,
ieVersion      string,
platform        string,
internalKeyword string,
resultSum      string,
currentPage    string,
linkPosition    string,
buttonPosition  string
)
partitioned by (date string,hour string) -- 分区表的分区字段以逗号分隔
row format delimited fields terminated by '\t';

第二步:导入数据到分区表
关键词:partition
举例:

hive (company)> load data local inpath '/home/admin/Documents/testdata/2015082818' into table company.track_log partition(date='20150828', hour='18');
hive (company)> load data local inpath '/home/admin/Documents/testdata/2015082819' into table company.track_log partition(date='20150828', hour='19');

第三步:查询数据

例:查询date为’20150828’且hour为’18’的第一条数据:

hive (company)> select url from track_log where date='20150828' and hour='18' limit 1;

九、聚合函数

1、函数的查看

hive (company)> show functions;

2、常见的函数
avg
sum
min
max
cast
case

3、举例
(1)按照empno分组,选出每个empno中的最高sal:MAX()

hive (company)> select empno , max(sal) maxsal from emp group by empno;

(2)按照部门进行薪资/sal的排位:ROW_NUMBER() OVER()

SELECT empno, ename, sal, deptno, ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) rank FROM emp;

(3)联表:JOIN ON

SELECT e.ename, e.empno, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno

(4)case函数

select ename, case when sal < 1000 then "lower" when sal >= 1000 and sal <= 2000 then "mid" else "high" end from db_hive_demo.emp;

十、自定义UDF函数

1、eclipse中新建一个maven项目,配置pom.xml,增加hive依赖,如下:


		org.apache.hive</groupId>
		hive-jdbc</artifactId>
		0.13.1</version>
</dependency>


		org.apache.hive</groupId>
		hive-exec</artifactId>
		0.13.1</version>
</dependency>

2、编写函数/类
在“src/main/java”的文件目录下编写类和对应的方法
3、打成jar包
选择类型:JAR file,并jar包命名
保存在服务器上
4、将jar包添加至hive的函数列表中
(1)启动hive,增加jar包,如下:

hive(default)> add jar jar包存放路径/jar包名;

(2)添加成功之后,需要将该函数添加至临时函数列表中

hive(default)> create temporary 函数名 as 'jar包中的类名/全限定名';

5、展示所有函数

hive(default)> show functions;

找到自定义的UDF函数
6、使用函数

十一、Hive自动化脚本

1、编写bash脚本

假设,要将log日志(存储路径:/home/admin/Documents/testdata/weblog,按照天命名文件夹,如:20150828,文件夹下是按照小时存储的文件:2015082818、2015082819……)导入到Hive的表中(即上传到HDFS中),脚本如下:

#!/bin/bash

#执行系统环境变量脚本,初始化一些变量信息
. /etc/profile

#定义Hive目录
HIVE_DIR=/opt/modules/cdh5.3.6/hive-0.13.1-cdh5.3.6/

#定义日志的存储路径
WEB_LOG=/home/admin/Documents/testdata/weblog

#定义hql文件存储的路径
HQL_DIR=/home/admin/Documents/hql

#定义日期
DAY=20150828

#遍历目录
for i in `ls $WEB_LOG/$DAY`
do
	echo "正在导入"$i"数据"
	DATE=${i:0:8}
	HOUR=${i:8:2}
	$HIVE_DIR/bin/hive --hiveconf LOADFILE_NEW=$WEB_LOG/$DAY/$i --hiveconf DATE_NEW=$DATE --hiveconf HOUR_NEW=$HOUR -f $HQL_DIR/auto_track_log.hql
done

注意:
(1)–hiveconf是Hive提供的将参数传递到hql中执行;

(2)如果想要自动化访问昨天的数据,可以将DAY作如下设置:

DAY=$(date --date="1 day ago" +%Y%m%d)

(3)这里不能用hive -e 的写法,即:

$HIVE_DIR/bin/hive -e "load data local inpath "$WEB_LOG/$DAY/$i" into table company.track_log partition (date='$DATE', hour='$HOUR')"

因为,执行的时候hql语句是需要加" “的,而这里放到脚本中执行的时候” "没有了。

2、编写HQL语句

load data local inpath "${hiveconf:LOADFILE_NEW}" into table company.track_log partition(date='${hiveconf:DATE_NEW}',hour='${hiveconf:HOUR_NEW}');

接收bash脚本的参数,用${hiveconf:参数名}接收。

3、执行脚本

十二、Hive中的几种排序

1、order by
全局排序,就一个Reduce

2、sort by
相当于对每一个Reduce内部的数据进行排序,不是全局排序。

3、distribute by
类似于MR中的partition, 进行分区,一般要结合sort by使用,使用之前要设置reduce数量:

set mapreduce.job.reduces = reduce数量;

reduce数量 = COUNT(DISTINCT(字段A)),即字段A去重的数量,字段A即distribute by 后面的字段

4、cluster by
当distribute和sort字段相同时,就是cluster by

你可能感兴趣的:(hive)