一.课程介绍
分十一章
- 基本概念
- 安装
- 数据类型
- DDL,数据定义
- DML,数据操作
- 查询
- 函数
- 压缩和存储
- 调优
- 实战谷粒影音
- 常见错误及解决方案
二.基本概念
Hive是个翻译引擎,仅存在于客户端,计算集群中不存在。
Hive无法支持迭代计算,数据挖掘不擅长
三.安装
Hive配置文件:conf/hive-env.sh.template,改为sh脚本再执行。要改hadoop文件位置和hive配置文件夹内容
use 《数据库》;
show tables;
create tables student(id int, name sring);
insert into student values(2, "sq");
desc student;
quit;
load data local inpath "/pata/data.txt" into table student;
drop table student;
create tables student(id int, name sring) row format delimited fields terminated by " ";
hive默认只有单一用户数据库
Mysql无主机登录:mysql数据库里user表;select User,Host,Password from user;update user set host='%' where host='localhost';delete from user where Host=;hadoop102';flush privilleges;
配置Hive MetaStore数据放Mysql里:1.拷贝mysql驱动到hive/lib下;2.conf/hive-site.xml配置;3.会在mysql里创建metastore数据库(可配置);
-e:sql在字符串里;-f:sql在文件里
exit:先提交再退出
quit:直接退出,但是新版的无区别了
dfs ls /;
! ls /;
历史命令在家目录下的.hivehistory中
hive-site.xml里可以配置当前数据库名称和表结构名称,hive.cli.print.header和hive.cli.print.current.db
数据仓库位置:hive.metastore.warehouse.dir里配置
日志默认都在logs文件下,hive-log4j.properties,配置hive.log.dir
修改配置:全局修改;命令行用-hiveconf配置键值对;终端中用set命令设置
set 键值,查看值
四.数据类型
hive数据类型大写
复合数据类型:STRUCT,MAP,ARRAY
CAST('1' as INT);把字符串1转换为INT
五.DDL
创建数据库:create database 《》;,默认文件夹路径在/usr/hive/warehouse/*.db
location后可以指定路径
if not exists不存在时执行
查询数据库:show databases;
模糊查询:show databases like 'hive#';
查询详情:desc database <数据库>;
extended查看额外信息
alter database 《数据库》 set dbproperties (”a“="b");
删除数据库:drop database 《数据库》;数据库不为空删不掉,最后要加cascade
创建表:CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type) [COMMNET col_commnet],...]……
要用JDBC连接Hive的话,要开hiverserver2服务;Beeline可以模拟JDBC连接Hive;
管理表:也叫内部表,表没了数据也没了
create table as
create table like
desc formatted <数据表>:查看表结构
内部表用来存中间结果和结果表,外部表存原始数据
内部表和外部表互相转换:alte table student2 set tlproperties(‘EXTERNAL'='FALAE');区分大小写和引号模式
partition就是建立一个单独的文件夹,大的数据集分为小的数据集,就是分目录,可以避免全表扫描
数据导入Hive时要指定分区,partition(分区名=’‘),指定分区列
alter table student add partition(分区名='');添加多个分区用空格分离
add改为drop即删除分区,删除多个partition用逗号分离
二级分区表:两个分区字段
分区表和数据产生关联的三种方式:
1.上传数据后修复:msck repair table 表名;
2.上传数据后添加分区
3.上传数据后load到分区
show partitions 表名;显示分区
修改表:
1.重命名:ALTER TABLE 名字 RENAME TO 新名
2.增加、修改、删除表分区
3.增加、修改、替换列信息:ALTER TABLE 表名 CHANGE COLUME 列旧名 列新名 列类型 ,change可为add和replace,replace是替换所有字段
六.DML
load加载数据
本地是复制导入,hdfs是移动导入;
insert插入数据:可以把select的中间表查询结果插入;可以有多插入模式,多行来自一个表可以放在开头;
as select方式创建表
创建表时通过location关键字指定数据位置来加载
import来导入export的数据
导出:
insert,导出到文件夹
hadoop dfs -get导出
hive shell输出重定向
export table 表明 to 路径,命令
清空表数据:truncate tabel 表名
hive可以导入任意格式的数据,只要数据可以被格式化可以被理解
七.查询
Hive的cwiki上有LanguageManual,可看select部分
列重命名:可以用as分隔也可以不用
join只能等值连接,内连接 left right full连接
order by,一个全局reducer,默认升序
sort by,局部reducer
属性mapreduce.job.reduces决定有几个reducer job,默认-1;
distribute by
类似分区,结合sort by使用,按照字段存在不同的文件中
cluster by
sort by和distribute by是一个字段
分桶表:一个文件夹内数据按文件存储而不是按文件夹,应对数据集过大,语法是clustered by;
分桶表用insert模式建立;
hive.enforce.bucketing为true;
reduce数量要hive自己决定;
分桶抽样:
tablesample(bucket 1 out of 4 on id)
x为从哪个bucket出,y为bucket的几分之几
八.函数
给null赋值:nvl,列如果是null,则返回replace值
case when:case 字段 when 数值 then 数值 else 数值 end
行转列:
所谓的行转列是指把数据表中具有相同key值的多行value数据,转换为使用一个key值的多列数据,使每一行数据中,一个key对应多个value。
行转列完成后,在视觉上的效果就是:表中的总行数减少了,但是列数增加了。
concat:连接字符
concat_ws:用分隔符连接字符,参数的列只能是字符类型或者string类型数组
collect_set:将某列数据去重,返回数组
select t1.c_b, CONCAT_WS("|", COLLECT_SET(t1.name)) from ( select CONCAT_WS(",", constellation, blood_type) c_b, name from person_info) t1 group by t1.c_b
列转行:
所谓的列转行是指把表中同一个key值对应的多个value列,转换为多行数据,使每一行数据中,保证一个key只对应一个value。
列转行完成之后,在视觉上的效果就是:表中的列数减少了,但是行数增加了。
explode:将一列中的map、array分为多行
lateral view udtf(expression) tableAlias as columnAlias,和explode、split等合用,用于拆分后的聚合
对原来的行进行侧写
select movie, category_name from movei_info lateral view explode(category) tmpTable as category_name;
窗口函数:
指定窗口,聚合函数应用窗口范围内数据进行计算
聚合函数,要是同时选区列,没有group by无法选择
跟在聚合函数后面,空格分离
只限定聚合函数
over:指定分析函数的窗口大小,不加参数即group by生成的组有几个。可以包含distribute by,按照某个字段分区来生成窗口
窗口限定了数据集合,每行数据按照属性进入不同的窗口中去
current row:当前行
n preceding:往前n行
n following:往后n行
unbounded:起点。unbounded preceding表示从前面的起点,unbounded following表示到后面的终点。
lag(col,n):往前第n行数据
lead(col,n):往后第n行
ntile(n):有序分区中的行分发到指定数据的组中,各个组有编号,从1开始。ntitle返回的是组号
九.压缩和存储;
十.调优
十一.实战
十二.常见错误