HIVE学习,安装,命令

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文件,内容如下:

javax.jdo.option.ConnectionURL

jdbc:mysql://192.168.123.219:3307/hive

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserName

root

javax.jdo.option.ConnectionPassword

123.

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在概念上是类似

每一个TableHive中都有一个相应的目录存在这个目录中

删除表时,元数据与数据都会被删除

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驱动导入sqooplib目录下

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

使用sqoopHIVE中的数据导出到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只支持:fromwhere子句中的子查询

 

 

你可能感兴趣的:(hive)