HIVE安装:
各版本下载地址:http://archive.apache.org/dist/hive/
1. mysql中创建一个hive数据库
2. 解压tar包 tar -zxvf xxxx.tar.gz
3. 把mysql数据库驱动jar包上传到hive/lib中
4. 进入hive/conf目录,创建hive-site.xml文件,内容如下:
5. 进入bin目录,pwd查看当前目录,将当前目录加入~/.bash_profile文件
HIVE_HOME=/root/hive
export PATH=$HIVE_HOME/bin:$PATH
HIVE命令行命令:
清屏:ctrl+L或者!clear
查看数据仓库中的表:show tables
查看数据仓库中的内置函数:show functions
-- 表示注释
查看表结构:desc 表名
查看HDFS上的文件:dfs -ls 目录
执行操作系统的命令:! 命令
执行hql语句:
Select * from test1;
Select tname from test1;
执行sql脚本:source /home/my.sql
hive -S进入静默模式,不打印调试信息
HIVE远程服务启动:
端口号:10000
启动方式:hive --service hiveserver
HIVE基本数据类型:
tinyint/smallint/int/bigint:整数类型
float/double:浮点数类型
boolean:布尔类型
string:字符串类型
HIVE复杂数据类型:
Array:数组类型,由一系列相同数据类型的元素组成
Map:集合类型,包含key->value键值对,可以通过key来访问元素
Struct:结构类型,,可以包含不同数据类型的元素。这些元素可以通过“点语法”的方式来得到所需要的元素。
HIVE时间类型
Date:从Hive0.12.0开始支持
Timestamp:从Hive0.8.0开始支持
内部表(table):
与数据库中的table在概念上是类似
每一个Table在Hive中都有一个相应的目录存在这个目录中
删除表时,元数据与数据都会被删除
create table t1(tid int,tname string,age int);
location ‘/mytable/hive/t2’指明存储位置
row format delimited fields terminated by ‘,’;指明用逗号分隔列
分区表(partition)
partition对应于数据库的Partition列的密集索引
在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中
create table partiton_table(sid int,sname string) partitioned by (gender string) row format delimited fields terminated by ’,’;
外部表(External Table)
指向已经在HDFS中存在的数据,可以创建Partition
它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异
外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个链接,当删除一个外部表时,仅删除该链接
桶表(Bucket Table)
桶表时对数据进行哈希取值,然后放到不同文件中存储。
视图(View):
视图是一种续表,是一个逻辑概念,可以跨越多张表
视图建立在已有表的基础上,视图赖以建立的这些表称为基表
视图可以简化复杂的查询
HIVE数据导入:
1.使用Load语句,语法:
LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]
Eg: load data local inpath ‘/root/data/student1.txt’ into table t2;
导入目录所有文件并覆盖已有:load data local inpath ‘/root/data/’ overwrite into table t3
将hdfs下文件导入:load data inpath ‘/input/student01.txt’ overwrite into table t3
导入分区表:loac data local inpath ‘/root/data/data1.txt’ into table partition_table partition (gender=’M’);
2. 使用sqoop进行数据的导入
sqoop下载地址:sqoop.apache.org
sqoop安装:
1. 解压:tar -zxvf sqoop-1.x.x.tar.gz
2. 设置环境变量:export HADOOP_COMMON_HOME=~/training/hadoop-2.x/
export HADOOP_MAPRED_HOME=~/training/hadoop-2.x/
3.将jdbc驱动导入sqoop的lib目录下
sqoop导入导出数据:
使用sqoop导入oracle数据到HDFS中:./sqoop import --connect jdbc:oracle:thin:@192.168.10.247:1521:orcl --username root --password 123456 --table emp --columns ‘empno,ename,job,sal,deptno’ -m 1 --target-dir ‘/sqoop/emp’
使用sqoop导入oracle数据到HIVE中:./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.10.247:1521:orcl --username root --password 123456 --table emp --columns ‘empno,ename,job,sal,deptno’ -m 1
使用sqoop导入oracle数据到HIVE中,并制定表名:./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.10.247:1521:orcl --username root --password 123456 --table emp --columns ‘empno,ename,job,sal,deptno’ -m 1 --hive-table emp1
使用sqoop导入oracle数据到HIVE中,并使用where条件:./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.10.247:1521:orcl --username root --password 123456 --table emp --columns ‘empno,ename,job,sal,deptno’ -m 1 --hive-table emp2 --where ‘DEPTNO=10’
使用sqoop导入oracle数据到HIVE中,并使用查询语句:./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.10.247:1521:orcl --username root --password 123456 --table emp -m 1 --query ‘SELECT * FROM EMP WHERE SAL<2000 AND $CONDITIONS’ --target-dir ‘/sqoop/emp5’ --hive-table emp5
使用sqoop将HIVE中的数据导出到oracle中:./sqoop export --connect jdbc:oracle:thin:@192.168.10.247:1521:orcl --username root --password 123456 -m 1 --table MYEMP --export-dir ****
HIVE-简单查询和fetch task
查询的语法:SELECT [ALL|DISTINCT] select_expr,select_expr,... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] | [ORDER BY col_list] ] [LIMIT number]
查询所有员工的所有信息:select * from emp;
查询员工信息:员工号 姓名 月薪:select empno,ename,sal from emp;
查询员工信息:员工号 姓名 月薪 年薪:select empno,ename,sal,sal*12 from emp;
查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入:select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0) from emp;
查询奖金为null的员工:select * from emp where comm is null;
使用distinct来去掉重复记录:select distinct deptno,job from emp;
fetch task 简单查询不需要转换成mapreduce左右,配置方式如下:
set hive.fetch.task.conversion=more;
hive --hiveconf hive.fetch.task.conversion=more
修改hive-site.xml文件
查询10号部门的员工:select * from emp where deptno=10;
查询名叫KING的员工:select * from emp where ename=’KING’;
查询部门号是10,薪水小于2000的员工:select * from emp where deptno=10 and sal<2000;
模糊查询:查询名字以S打头的员工:select empno,ename,sal from emp where ename like ‘s%’;
模糊查询:查询名字含有下划线的员工:select empno,ename,sal from emp where ename like ‘%\\_%’;
查询中使用排序:
查询员工信息:员工号 姓名 月薪 按照月薪排序:select empno,ename,sal from emp order by sal;
order by 后面可以跟: 列,表达式,别名,序号
查询员工信息,按照奖金排序:select empno,ename,sal,comm from emp order by comm;
null升序排在最前,降序排在最后
数学函数:
四舍五入:round(数字,保留位数)
select round(45.926,2);
向上取整:ceil
select ceil(45.9); 结果为46
向下取整:floor
select floor(45.9);结果为45
字符函数:
lower:把字符串转成小写
upper:把字符串转成大写select upper(‘Hello World’)
length:字符串长度 select length(‘你好’)
concat:拼加一个字符串 select concat(‘Hello’,’World’)
substr:取字符串子串
trim:去掉字符串前后空格
lpad:左填充 select lpad(‘abcd’,10,’*’),rpad(‘abcd’,10,’*’);
rpad:右填充
收集函数和转换函数:
收集函数size:size(map(
select size(map(1.’TOM’,2,’Marry’));结果为2
转换函数:select cast(1 as bigint); select cast(1 as float);select cast(‘2015-09-08’ as date);
日期函数:
to_date:返回日期 select to_date(‘2015-03-14 11:23:11’);返回2015-03-14
year,month,day:返回年月日
weekofyear:返回时间是一年中的第几个星期 select weekofyear(‘2015-03-14 11:23:11’)
datediff:返回两个日期相差天数
date_add,date_sub:日期加上或减去多少天
条件函数:
coalesce:从左到右返回第一个不为null的值
select comm,sal,coalesce(comm,sal) from emp;
case...when...:条件表达式:给员工涨工资,总裁1000 经理800 其他400
select ename,job.sal.
case job when ‘PRESIDENT’ then sal+1000
when ‘MANAGER’ then sal+800
else sal+400
end
from emp;
聚合函数:
count,sum,min,max,avg
表生成函数:explode
HIVE的表连接:
等值连接:有一个等号
select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;
不等值连接:
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
外连接:按部门统计员工人数:部门号,部门名称,人数
select d.deptno,d.dname,count(e.empno) from emp e right outer join dept d on (e.deptno=d.deptno) group by d.deptno,d.dname;
自连接:查询员工的姓名和员工老板的姓名
select e.ename,b.ename frome emp e,emp b where e.mgr=b.empno;
自连接的核心:通过表的别名将同一张表视为多张表
HIVE的子查询:
Hive只支持:from和where子句中的子查询