HIVE总结

1.Hive架构设计概念

user interface :hive cli,hive client,hwi 	
Hive CLI(hive command line interface):Hive命令行交互模式,默认支持 
Hive Client(jdbc/odbc/beeline):Hive jdbc交互模式,外部程序或者服务对接的必选项 
HWI (hive web interface):Hive web交互模式,cli模式的补充 	
HiveServer2:以Thrift为基础实现的跨语言的接口调用,并支持多客户端的并发和认证 	
Driver (SQL Parser Query Optimizer Excution):Hive核心驱动器接口类,衔接UI与内核的解析、优化、执行器的桥梁 	
MetaStore (Mysql,Derby):Hive元数据存储,包括库、表、分区、可嵌入式、本地、远程独立部署

2.Hive运行流程:

(Hive CLI,Hive Client-->HiveServer2,HWI) -->Driver <-->MetaStrore

HIVE总结_第1张图片

3.Hive是构建再hadoop上的数据仓库框架,解决了非开发人员使用hadoop的问题,Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本质是将HQL转换为MapReduce程序(可以看做对MapReduce的封装)

4.Hive非常适合数据仓库中,对时延要求不那么敏感的场景。低时延的使用Hbase

5.Hive主要用于查询,不支持行级别的update和delete

6.传统仓库区别: Orcal 是单机, Hive基于HDFS分布式

7.读时模式:shema on read 为了更好的写入数据,在读的时候进行模式检查

8.写时模式:shema on write 为了更好的查,在写的时候进行模式检查

9.Hive meta data 2中存储方式: 内置Derby 有目录缺陷和单会话缺陷 Mysql

10.HQL语句不识别TAB分隔

11.元数据 metadata
原数据 original data
源数据 source data

12.Hive常用命令:

    1.执行Hadoop命令: dfs -ls /user/....
	2.执行linux命令:! ls /user/...
	3.Hive命令行中默认显示库名
		cd ~
		vi .hiverc
		set hive.cli.print.current.db=true; -->显示库名
		set mapred.job.name=hive-cli-01; -->显示job名

13.Hive数据模型: 库,表,分区,分桶

14.Hive表分类:

    分类1:内表(托管表,管理表):删除元数据,真实数据
		   外表(external):只删除元数据
	分类1使用场景:数据只为hive使用,建立内表
				   数据还可能给hive以外的程序使用,数据本身就是给hive以外的程序建立的使用,hive只是共享使用,使用外表
	分类2:普通表,分区表,分桶表,分区分桶表

15.Hive数据类型基本类型

数值(tinyint,smallint,int,bigint,float,double),string,boolean,timestamp,binary

16.Hive数据类型之复杂类型:array,map,struct

    1.select形式输入:
		select array(1,2,3);
		select map("a",1,"b",2);
		select struct(1,2)
	2.建表字段为复杂类型
		create table table_name (
		info_1 array,
		info_2 map
		info_3 struct
		info_4 struct
		)
		row format delimited
		fields terminated by ','
		collection items terminated by '::'
		map keys terminated by '\003';
	3.insert复杂类型
		insert into emp01 select 'tom',array('english','chinese') from dual;
		insert into userinfo select 'tom',map('type','chinese') from dual;  
		insert into userinfo select 'tom',struct('hebei','[email protected]','male') from dual;  
		(struct类型 不能轻易insert,必须字段名为:col1,col2,col3....)
	4.load复杂类型
		load data inpath '....' into table emp01; 
		load的时候注意原文件的分隔符等因素
	5.访问复杂类型
		select id, name[0], score['all'] , score['语文'], addr.province from demo;

17.Hive文件格式及压缩格式

    1.默认文件格式:textfile     面向行:txt,seq,面向列:rc,orc
	2.压缩格式:可切分:lzo,bz2 不可切分:snappy,gzip
	3.查看hive/hadoop中内置编码,解码
		set io.compression.codes;

18.压缩优缺点:

    优点:减少占用磁盘的空间,减小磁盘或者网络i/o,从而提高吞吐量和i/o性能
	缺点:增加cup开销

19.HQL DDL

    1.输入规范:
		CREATE, DROP, ALTER
		DESC <表名>;(DESCRIBE <表名>; 的简写)
		DESC FORMATTED <表名>;
		SHOW CREATE TABLE <表名>;
	2.修改表结构时,只是修改的结构,数据是不会变的,这里hive与MySQL不同,要注意
	3.根据某表结构创建另外一张表
		CREATE TABLE 表1名 LIKE 表2名
		INSERT INTO 表2名 SELECT *  FROM 表1名;
	4.修改表的名称
		ALTER TABLE 表旧名 RENAME TO 新名;
	5.给表添加字段
		ALTER TABLE 表名 ADD COLUMNS (字段名 字段类型);
	6.修改表的字段
		ALTER TABLE my_tbl_2 REPLACE COLUMNS (name string);
		ALTER TABLE my_tbl_2 REPLACE COLUMNS (id int, name string);
		ALTER TABLE my_tbl_2 REPLACE COLUMNS (id int, age int, salary double);
		ALTER TABLE my_tbl_2 REPLACE COLUMNS (id int, name string, salary double);

        ALTER TABLE my_tbl_2 CHANGE COLUMN id my_id int;
		ALTER TABLE my_tbl_2 CHANGE COLUMN id id int AFTER age;
		ALTER TABLE my_tbl_2 CHANGE COLUMN id id int FIRST;
	7.字段名是乱码的问题:
		因为Hive的元数据MySQL设置是latin。。。。
	8.建表模板(默认参数):
		create [external] table [if not exists] 表名 (
		字段名 字段类型,
		字段名 字段类型
		)
		comment 表注释
		partitioned by 字段名,字段名
		clustered by 字段名,字段名
		sorted by 字段名,字段名 into 分桶个数 buckets
		row format delimited
		fields terminated by '\001'
		collection items terminated by '\002'
		map keys terminated by '\003'
		lines terminated by '\n'
		stored as textfile
		location hdfs_path;
		
     9.关键词解释
    	 external: 创建内部表还是外部表,此为内外表的唯一区分关键字。
    	 comment col_comment: 给字段添加注释
    	 comment table_comment: 给表本身添加注释
    	 partitioned by: 按哪些字段分区,可以是一个,也可以是多个
    	 clustered by col_name... into num_buckets BUCKETS:按哪几个字段做hash后分桶存储
    	 row format:用于设定行、列、集合的分隔符等设置
    	 stored as : 用于指定存储的文件类型,如 text,rcfile 等
    	 location : 设定该表存储的 hdfs 目录,如果不手动设定,则采用hive默认的存储路径
	10.Hive表的默认配置
		CREATE TABLE demo (
		id INT, 
		name STRING, 
		salary DOUBLE, 
		nick_name ARRAY, 
		score MAP, 
		addr STRUCT 
		) 
		ROW FORMAT DELIMITED 
		FIELDS TERMINATED BY '\001' 
		COLLECTION ITEMS TERMINATED BY '\002' 
		MAP KEYS TERMINATED BY '\003' 
		LINES TERMINATED BY '\n' 
		STORED AS TEXTFILE;

20.HQL DML

   1.插入数据3种方法:
		1.insert values:
			insert into demo (name, id, salary) values ('Lucy', 6, 3.4);
		2.将查询结果插入表中:
			insert  表名
			partition (col1=...,col2=...) + 查询语句
			select * from (
			select 1, 'abc', 5.6 
			union all 
			select 2, 'xyz', 7.8	
			) t;   -->别名t必须有
		3.加载数据
			load data [local] inpath '文件路径' [overwrite] into table 表名 partition (col1=...);
	2.多插入模式:
		from 表名
		insert overwrite table 表1名 partition(col1=11)
		select id,name,cla where id = ...
		insert overwrite table 表2名 partition()
		select * where name = ...		
	3.将表数据写入到hdfs目录中:
		insert overwrite [local] directory "目录路径" 
		row format delimited
		fields terminated by '\t'
		select * from 表名 where ....	
	4.语句规范
		1.INSERT  <表名> <查询语句>
		2.LOAD DATA [LOCAL] INPATH '<绝对路径>' [OVERWRITE] INTO TABLE <表名>;
		3.OVERWRITE是先删除原数据再添加新数据,否则就是直接追加
		4.LOCAL代表从本地文件系统进行复制,不加LOCAL则从HDFS进行移动
		5.绝对路径要用引号引起来,绝对路径可以是单个文件,也可以是一个目录,如果是一个目录,则会读取该目录下所有的文件内容(不递归,建议不要再有子目录)

21.Hive DQL

   1.单表查询:
		1.where :同MySQL差不多
		2.distinct
			select distinct teacher_id from student_score;  -->一般是数据清洗了
			数据量大的话推荐使用group by
		3.group by:
			group by id,name,score,teacher_id;    -->group by后面的字段得写全
		4.limit
			select id,name,score,teacher_id from student limit 1;
		5.统计函数/聚合函数/分组查询count,sum,avg,max,min,group by,having
	2.order by 与 sort by
		1.概念
			order by是全局排序,它会只使用一个reducer;
			sort  by是部分排序,每个reducer的输出均有序,但是全局上不一定有序	
		2.order by
			partition (dt='20181105') 
			insert overwrite table mb1_sort 
			select uid, name, url from mb1 order by uid;
		3.sort by
			insert overwrite table mb1_sort 
			partition (dt='20181104') 
			select uid, name, url from mb1 sort by uid;
		4.Hive中设置reduce个数:
			set mapred.reduce.tasks=3;
	3.distribute by 和 cluster by
		1.distribute by 概念:
			控制mapper的输出在reducer中是如何划分的,解决的问题和分桶一样
			分桶机制是在与建表语句结合使用的
			如果我们只是进行select操作,并将结果输出到一张未分桶的表中时,
			为了实现和分桶一样的效果,就要在select语句中使用distribute by	
		2.必需事项:
			2.1.同时需要设置和分桶个数相匹配的reducer数目
				set mapred.reduce.tasks=3
			2.2.示例:
				insert overwrite table mb1_cluster 
				partition (dt='20181105') 
				select uid, id, name, url 
				from mb1 
				distribute by uid;   -->相同的uid会放到一个桶中
			2.3.之后可以直接sort by
				insert overwrite table mb1_cluster 
				partition (dt='20181104') 
				select uid, id, name, url 
				from mb1 
				distribute by uid 
				sort by id;
			3.cluster by
				等价于 distribute by uid sort by uid
	4.多表查询-union/union all
		union     去重,相对效率低
		union all 不去重
		Hive要求:连接的查询字段数量要相同,对应字段类型也要相同
	5.多表查询-子查询/连接查询	
		1.在select之后
			不支持子查询,改为连接查询
		2.在from之后
			类似与MySQL
		3.在where之后
			类似与MySQL
		4.Hive查询特点
			4.1.Hive会对每一个join操作触发一个MR Job
				(如a join b join c:针对a join b触发一个Job,计算出a join b的结果后,
				再使用这个结果join c,这又会触发一个Job)
			4.2.目前,Hive只支持等值连接。
		5.join查询
			inner join:
			left outer join:左表为主,左表数据全部保留,没有关联上的数据设置为NULL
			right outer join:
			full outer join:么有关联上数据字段全部设置为NULL
	6.注意事项:
		1.对分号敏感:
			rdb sql分号使用:
			select concat(key,concat(';',key)) from table;
			hive 分号使用:
			select concat(key,concat('\;',key)) from table;
		2.NULL值判断:
			is null 或者 is not null

22.分区

   1.分区概念:
		1.Hive在查询时通常是做全表扫描的,而一个好的分区设计可以避免全表扫描
		  并且可以大大减少Hive的扫描数据量
		2.最常见的分区表是按天建立分
		  (当然也有使用时间空间两个维度进行分区的,第一个分区是按天建立的,
		  第二个则按地区建立)
		3.分区不能过多,否则就会大大增加NameNode的压力
		  (Hadoop HDFS更适合存储与处理少量的大文件而不是大量的小文件)
		  这时候一般就会结合使用分桶机制
		4.分区是一种特殊的列,这种列的值不在数据文件中,而是通过目录名称读取的,
		  分区实际上正对应了HDFS中的目录
	2.分区:
		1.表结构:
			create table my_access_history (
			id int,
			name string,
			url string
			) 
			partitioned by (dt string) 
			ROW FORMAT DELIMITED 
			FIELDS TERMINATED BY '\t' ;
		2.load数据:
			vi my_access_history
			2	小明	http://www.qq.com/
			LOAD DATA LOCAL INPATH 'my_access_history' 
			INTO TABLE my_access_history
			PARTITION (dt='20181017');
		3.insert数据:
			INSERT INTO my_access_history 
			PARTITION  (dt='20181019') 
			SELECT * FROM (
			SELECT 2, 'James', 'http://www.google.com/' 
			)t;
		4.查看表有哪些分区:
			show partitions my_access_history;
		5.规范查看分区:
			select * from 表名 where dt=2222 limit 10;
		6.动态分区(默认关闭,使用静态分区)
			set hive.exec.dynamic.partition=true;
			set hive.exec.dynamic.partition.mode=nonstrict;
			有2个分区字段的时候,第一个必须是静态的,第二个是动态的
			INSERT INTO my_access_history 
			PARTITION (dt) 
			select * from (
			SELECT 1, '小红', 'http://www.baidu.com/', '20181020'
			)t;

			INSERT INTO my_access_history 
			PARTITION (dt) 
			select * from (
			SELECT 1, '小红', 'http://www.baidu.com/', '20181021' 
			union all 
			SELECT 3, '小强', 'http://www.google.com/', '20181022'
			)t;

			INSERT OVERWRITE TABLE my_access_history 
			PARTITION (dt) 
			select * from (
			SELECT 1, '小红', 'http://www.baidu.com/', '20181018' 
			union all 
			SELECT 3, '小强', 'http://www.google.com/', '20181018'
			)t;

23.分桶

1.概念:分桶可以使数据均匀分布,提高查询效率
		 (尤其是连接查询map side join),特别适用于抽样查询场景
 2.桶的数量一般对应reducer的数量

3.建表位置:
			create table my_access_history_buckets (
			user_id int, 
			id int,
			name string,
			url string
			) 
			partitioned by (dt string) 
			clustered by (user_id) into 10 buckets 
			ROW FORMAT DELIMITED 
			FIELDS TERMINATED BY '\t' ;
4.设置分桶:	
		set hive.enforce.bucketing=true;
5.正确分桶:
			5.1.使用load方式导入的数据肯定不会自动分桶
			5.2.使用select方式导入的数据也不一定会自动分桶
			5.3.我们应该使用cluster by来保证分桶
				insert overwrite table mb 
				partition(dt=20181105) 
				select uid, id, name, url 
				from mb 
				where dt=20181107 
				cluster by uid;
			5.4.如果我们不使用cluster by,就必须保证select的数据的来源必须是经过真正分桶的,
				 或者像下面这样,数据是来源于一系列计算的最终结果的
				insert overwrite table mb 
				partition(dt=20181103) 
				select * from (
				SELECT 10010, 1, '小红', 'http://www.baidu.com/' 
				union all 
				SELECT 10011, 3, '小强', 'http://www.google.com/' 
				union all 
				SELECT 10012, 2, '小明', 'http://www.sogou.com/' 
				)t;
6.load的正确分桶姿势:
			1.数据准备:
			10000	1	刘十三	http://www.baidu.com/
			10001	2	张三	http://www.le.com/
			10002	3	李四	http://www.google.com/
			10003	4	王五	http://www.ip138.com/
			10004	5	赵六	http://www.qq.com/
			10005	6	小明	http://www.qq.com/
			10006	7	小红	http://www.qq.com/
			10007	8	小强	http://www.qq.com/
			10008	9	小刚	http://www.qq.com/
			10009	10	小小	http://www.qq.com/
			2.进行Load操作到一张新表中:
			LOAD DATA LOCAL INPATH 'my_access_history_buckets' 
			INTO TABLE my_access_history_buckets 
			PARTITION (dt='20181017');
			3.从新表查询插到需求的表中:-->注意最后的cluster by uid
			FROM my_access_history_buckets mahb
			INSERT OVERWRITE TABLE my_access_history_buckets 
			PARTITION(dt=20181016) 
			SELECT user_id, id, name, url WHERE mahb.dt in (20181017, 20181021)
			cluster by uid;

24.常见属性

    1.当需要对HQL进行调优时,除了优化HQL语句本身外,更多的选择是调整相关属性的值
	2.mapred.job.name  -->任务名字
	3.mapreduce.job.queuename  -->当前任务队列名字
	4.mapred.reduce.tasks  -->reduce数量
	5.hive.cli.print.current.db -->当前所属库名
	6.动态分区
		hive.exec.dynamic.partition
		hive.exec.dynamic.partition.mode
	7.分桶
		hive.enforce.bucketing
	8.本地执行
		hive.exec.mode.local.auto -->任务量小,使用本地执行
		修改hive.exec.mode.local.auto为true/false对比,发现设置为true时,
		数据量较少,并未提交到集群而是使用本地执行(Job running in-process(local Hadoop))
	9.Hive触发的MR Job并行运行
		hive.exec.parallel
		修改hive.exec.parallel为true/false对比,发现设置为true时,由于启用了并发,查询要更快

25.Hive系统函数

   1.显示所有系统函数:
		show functions;
	2.查函数的用法:
		desc function 'current_date';
		desc function extended 'current_date';
	3.系统信息类
		如select  current_database();显示当前所处数据库是哪个。
		(可以使用use  <数据库名>切换所在库)
	4.类型转换
		将浮点数转换为整数时,优先考虑使用round()、floor()、ceil(),这种转换比较优雅
		如select  cast('1' as double);将字符串1转换为double的1.0。如果无法完成转换则返回NULL

26.Hive常用系统函数

    1.coalesce()函数
		coalesce(v1,v2,...)将参数列表中第1个不为null的值作为最后的值	
	2.字符类
		如select  length('中国'); Returns the length of str or number of bytes in binary data
		如select  concat(  'a',  'b',  'c',  'd');返回  'abcd'。字符串拼接函数(可变元参数)。
		如select  concat_ws(  '=',  'a',  'b',  'c');返回  'a=b=c'。字符串拼接函数(可变元参数,但是第一个参数必须是拼接间隔符)。但是可以指定拼接间隔符。
		如select  upper('abcd');返回ABCD。将参数中所有小写字母转换为大写。
		如select  lower('ABCD');返回abcd。将参数中所有大写字母转换为小写。
		如select  substring(  '系统信息类',  1,  3  );返回  系统信。第2个参数代表从1开始的第几个字符,第3个参数代表截取字符个数。
		如select  trim('  abc  ');返回 abc。用于删去参数左右的所有空格。
		如select  instr('abcdf','df');返回'df'首次出现的位置  4
	3.日期时间类
		select  current_date();返回当前日期
		select  current_timestamp();返回当前日期时间(单位毫秒)
		select  unix_timestamp();返回当前日期时间对应的时间戳(单位秒)
		select  unix_timestamp('1970-01-01 08:00:01');返回指定日期时间对应的时间戳(单位秒)
		select  unix_timestamp('1970-01-01 08:00:01','yyyy-MM-dd HH:mm');
		select  from_unixtime(1527163397);返回指定时间戳(单位秒)对应的日期时间
		select  from_unixtime(1527163397,'yyyy-MM-dd HH:mm:ss.SSS');
		select  datediff(  '2018-11-09',  current_timestamp()  );返回两个参数对应日期相差的天数,不足一天按0算(用第一个参数减第二个参数)
		select  date_add( current_timestamp(), -2 );返 回指定天数前/后的日期时间(第一个参数是日期时间,第二个参数是天数,向后加是正数,向前减是负数)
		select  date_sub( current_timestamp(), 2 );

    4.与日期时间相关的函数
		date_format、
		to_date、
		day/dayofmonth、
		month、year等,
		请大家使用命令desc function extended '函数名';进行学习
	5.条件判断类
		select  if(  <判断条件>,  <条件为真时的返回值>,  <条件为假时的返回值>  );相当于Java中的三目运算符<判断条件>  ?  <条件为真的返回值>  :  <条件为假的返回值>。
		如select  if(1=1,  2,  3);返回2。
		如select  nvl(<表达式或者字段>,  <表达式或者字段为NULL时的返回值>);通常用于给有可能有NULL的情况下的提供默认值。
		如case when then else end
	6.split()
		将字符串拆分成一个数组
	7.case...when		
		select sname,
		max(case cname when 'Java' then score else 0
		end) Java, max(case cname hen 'MySQL' then score else 0
		end) MySQL from student_score group by sname;
	8.explode()
		将一个集合元素,行转列,打散成一行一行的组成		
	9.lateral view
		形成一张新表
	10.Hive中没有group_concat函数,使用collect_list()不去重collect_set()去重来模拟,使用UDAF实现
		select sname,
		concat_ws(' | ', collect_list(cname)), 
		concat_ws(' | ', collect_list(cast(score as string))) 
		from student_score
		group by sname;
	11.表生成函数
		lateral view 与 explode(),Hive中表生成函数还有其他很多
		select 新表名.* from 原表 lateral view 
		explode(split(原表字段,',')) 新表名 as 新字段

27.Hive自定义函数

1.用户定义函数
		1.概述
			用户定义函数即User Defined Function。
		2.Hive中有3种UDF:
			普通UDF,
			用户定义聚合/聚集函数User Defined Aggregate Function
			用户定义表生成函数User Defined Table-generating Function
		3.UDF:接受一行数据,返回一行数据,大多数函数都属于此类
		4.UDAF:接受多行数据,返回一行数据,
			count()、sum()、avg()、max()、min()
			通常与 group by 组合使用
		5.UDTF:接受一行数据,返回多行数据,
			explode(),Hive只允许UDTF以特定方式使用
			explode()一般要与lateral view 组合使用

2.开发步骤如下
		1.编写Java代码(UDF必须使用Java编写,当然Hive对于非Java程序员也提供了Streaming机制)
		2.打包,如mvn clean package
		3.在Hive中注册此jar包,ADD JAR ;建议此处使用绝对路径,
		  相对路径的话不太方便,因为我们并不能保证每次进入hive命令行的目录位置是固定的。
		  Hive会将此jar包加到classpath中,并上传到分布式缓存以使整个集群所有节点均可使用此jar包
		4.定义临时函数,create temporary function <函数名> as '<自定义UDF类的类全名>';
		  temporary说明此函数只在当前会话有效
		  如果使用频繁可以添加到本地文件系统的~/.hiverc文件中
		  如果你想把自己的函数永久化地加入到Hive中,是需要修改并重新编译打包Hive本身的源代码的
		5.在HiveQL中像使用系统函数那样(select count(*) from mytable)使用UDF即可
		6.可以使用drop temporary function <函数名> 将其删除,也可以不删除

3.编写Java代码时注意
		1.一个用户定义UDF类必须是org.apache.hadoop.hive.ql.exec.UDF类的子类;
		  必须至少实现了一个evaluate()方法
		  (此方法的输入参数与Hive调用函数时的输入参数是对应的,如果实际调用函数时支持多个参数输入,可以将此方法重载)
		2.一个用户定义UDAF类必须是org.apach e.hadoop.hive.ql.exec.UDAF的子类,
		  该子类内部要定义一个或者多个实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator接口的
		  public static class
		  (另外多个静态类用于像UDF中重载evaluate()方法那样“重载”UDAF)。
		  每个静态类中,必须要重写5个方法
			2.1.方法void  init()。
				初始化。无参无返回值。必须在静态类的构造方法中调用init()
			2.2.方法boolean  iterate(P p1...)
				此方法输入参数与Hive调用函数时的输入参数是对应的。
				每次对一行新数据进行聚合/聚集计算时都会调用此方法,返回值一般都设置为true
			2.3.方法M  terminatePartial()。
				此方法的返回值必须是一个封装了当前聚合计算状态/结果的对象/变量,
				相当于map阶段的输出的中间结果,无输入参数。一般会在静态类中定义一个M类型的实例变量用于跨方法使用
			2.4.方法boolean  merge(M m)
				此方法的输入参数必须与terminatePartial()方法的返回值对应。
				相当于reduce阶段的输入,返回值一般都设置为true
			2.5.方法R  terminate()。
				此方法的返回值就是最终结果,无输入参数
			2.6.注意,上面terminatePartial方法的返回值类型M与terminate方法的返回值类型R可以相同,也可以不同,要看具体情况而定

28.pom依赖


		
			nexus-aliyun
			Nexus aliyun
			http://maven.aliyun.com/nexus/content/groups/public
		
	


	
		junit
		junit
		4.12
		test
	
	
		org.apache.hadoop
		hadoop-client
		2.7.4
		provided
	
	
		org.apache.hive
		hive-cli
		1.2.1
		provided
	



	hive
	
		
			org.apache.maven.plugins
			maven-compiler-plugin
			2.3.2
			
				1.7
				1.7
				UTF-8
			
		
		
			org.apache.maven.plugins
			maven-assembly-plugin
			2.3
			
				
					jar-with-dependencies
				
			
			
				
					make-assembly
					package
					
						assembly
					
				
			
		
	
		

29.Hive数据分析函数

    1.分析函数:
		1.1.ntile			对数据分片并返回当前分片值
		1.2.row_number		用于排序,1,2,3...
		1.3.rank			排序 1,2,2,4...
		1.4.dense_rank		排序 1,2,2,3...   select id,name,score,dense_rank() over(order by score) from xxx;
		1.5.cume_dist		累计计算,小于等于当前值的行数/分组内总行数 数据分布场景
		1.6.percent_rank	累计计算,分组内当前行rank值-1/分组内总行数-1  处理进度
	2.窗口函数
		2.1.lag(col,n,default)
			用于统计窗口内往上第n行值(当该字段为空时,设置为default值)
		2.2.lead-
			用于统计窗口内往下第n行值
			first_value:取分组内排序后,截至到当前行,第一个值
			last_value:取分组内排序后,截至到当前行,最后一个值
	3.增强GroupBy
		3.1.grouping sets		结果集进行union all
		3.2.crouping_id			标识结果集属于哪个分组集合,虚字段
		3.3.cube				所有组合经行聚合
		3.4.rollup				以最左侧维度为主,从该维度经行层级聚合
	4.over()从句
		4.1.与标准聚合函数count,sum,min,max,avg连用 sum(...) over(...)
		4.2.与匹配的分析窗口联用, row_number() over(...)
		4.3.使用partition by 语句,使用一个或者多个原始数据类型的列
		4.4.partition by ... order by... 使用一个或者多个数据类型的分区或者排序列
		4.5.使用窗口规范:
			4.5.1.rows between :窗口子句,物理截取,从行数上控制截取数据的大小
			4.5.2.range between :窗口子句,逻辑截取,从列值上控制窗口的大小
			4.5.3.preceding :子句之往前
			4.5.4.following :子句之往后
			4.5.5.current row:子句之当前行
			4.5.6.unbounded:子句之起点,unbounded preceding 从前面的起点,unbounded following 到后面的终点。
		4.6.order by 子句后没有跟着多大窗口,则默认 range between unbounded preceding and current row

30.Hive执行引擎

1.配置Mr计算引擎
	set hive.execution.engine=mr;
2.配置spark计算引擎
	set hive.execution.engine=spark;
3.配置tez计算引擎
	set hive.execution.engine=tez;
4.MapReduce:是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,
			非常适合数据密集型计算。
5.Spark:Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,
		Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点
		但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,
		因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。
6.Tez: 是基于Hadoop Yarn之上的DAG(有向无环图,Directed Acyclic Graph)计算框架。
		它把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,
		减少了Map/Reduce之间的文件存储。同时合理组合其子过程,也可以减少任务的运行时间
		Tez可以将多个有依赖的作业转换为一个作业(这样只需写一次HDFS,且中间节点较少)从而大大提升DAG作业的性能

31.Hive特点

可扩展:Hive可以自由的扩展集群的规模,一般情况下不需要重启服务
延展性:Hive支持用户自定义函数udf,用户可以根据自己的需求来实现自己的函数
容错:良好的容错性,节点出现问题SQL仍可完成执行

32.为什么一次写入多次读取

数据存储在HDFS中
写入后不能修改了,只能删除后再写入(为了性能放弃)
互斥锁影响性能(多个I/O同时写,就要互斥锁,而锁会大幅度降低性能)

你可能感兴趣的:(数据库)