Hive sql常用语句

1.建库语句:
	CREATE DATABASE [IF NOT EXISTS] database_name
	[COMMENT database_comment]
	[LOCATION hdfs_path]
	[WITH DBPROPERTIES (property_name=property_value, ...)];
		例:
			create DATABASE if NOT EXISTS hive_db2
			comment "my first database"
			location "/hive_db2"
2.库的修改:
	alter database hive_db2 set DBPROPERTIES ("createtime"="2018-12-19");
3.库的删除
	drop database db_hive cascade if exists; -- 删除存在表的数据库
3.建表语句:
	CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
	[(col_name data_type [COMMENT col_comment], ...)] 
	[COMMENT table_comment] 
	[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
	[CLUSTERED BY (col_name, col_name, ...) 
	[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
	[ROW FORMAT row_format] 
	DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
			[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
	   | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
	[STORED AS file_format] Textfile
	[LOCATION hdfs_path]
	[TBLPROPERTIES (property_name=property_value, ...)]
	[AS select_statement]1create table student2(id int COMMENT "xuehao", name string COMMENT "mingzi")
			COMMENT "xueshengbiao"
			ROW format delimited
			fields terminated by '\t'
			STORED as Textfile
			location '/student2' -- 直接加载该目录下的数据文件到表中
			TBLPROPERTIES ("createtime"="2018-12-18");2create table student(id int, name string)
			row format delimited
			fields terminated by '\t';
			load data local inpath '/opt/module/datas/student.txt' into table student;3create table student4 like student2; -- 仅复制表结构
4.导入数据语句
	4.1 不加local则导入hdfs上文件,但会剪贴原文件,local本地仅粘贴
			load data [local] inpath '/opt/module/datas/student.txt' 
			[overwrite] into table student [partition (partcol1=val1,)];
	4.2 创建表并导入数据(依据以存在的表)
			create table student6 as select * from student; -- 仅导入数据,不会导入其他细节属性 --被创建表不能是外部表 -- 被创建表不支持分区及分桶
	4.3 覆盖插入
			insert overwrite table student3 select * from student;
	4.4 插入带分区的表
			insert into table stu_par partition(month = '08') select id ,name from stu_par where month = '09';
	4.5 将单表中数据导入多表
			from student
			insert into table student4 select *
			insert into table student5 select *;
	4.6 多分区导入单表
			from stu_par
			insert into table stu_par partition(month = '06')
			select id ,name where month = '08'
			insert into table stu_par partition(month = '07')
			select id,name where month = '10';
5.表的修改操作
	5.1 修改表的属性
			alter table stu_ex set TBLPROPERTIES ('EXTERNAL' = 'TRUE');
	5.2 重命名表名
			alter table student4 rename to student3;
	5.3 修改表的serde属性(序列化和反序列化)
		alter table table_name set serdepropertyes('field.delim'='\t');
6.列的更新操作
	6.1 修改列语法
		ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
	6.2 增加或替换列语法
		ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)1:
			增加列:alter table student2 add COLUMNS (score double);2:
			修改列:alter table student2 CHANGE COLUMN score score int AFTER id;3:
			替换列(全部替换):alter table student2 replace COLUMNS (id int, name string);
7.带有分区的表
	7.0 查看分区
			show partitions table_name;
	7.1 创建单个分区
			create table stu_par(id int, name string)
			partitioned by (month string)
			ROW format delimited
			FIELDS terminated by '\t';
		-- 错误示例
			create table stu_par2(id int, name string)
			partitioned by (id int)
			ROW format delimited
			FIELDS terminated by '\t';  错!!!!(不能以数据库字段作为分区)
		-- 加载数据到指定分区(分区不存在则自动创建)
			load data local inpath '/opt/module/datas/student.txt' into table stu_par partition(month = '12');
			load data local inpath '/opt/module/datas/student.txt' into table stu_par partition(month = '11');

		-- 合并分区查询结果
			select * from stu_par where month = '11'
			union
			select * from stu_par where month = '12';
	7.2 增加多个分区
		alter table stu_par add partition (month = '08') partition(month='07');
	7.3 删除多个分区
		alter table stu_par drop partition(month='08'),partition(month='09');
	7.4 创建多级分区
		create table stu_par2(id int, name string)
		partitioned  by (month string, day string)
		row format delimited
		FIELDS terminated by '\t';
	7.5 导入数据到多级分区
		load data local inpath '/opt/module/datas/student.txt' into table stu_par2 
		partition (month='12',day='19');
	7.6 向多级分区增加分区
		alter table stu_par2 add partition(month = '12', day = '17');
	7.7 查询多级分区中的数据
		select * from stu_par2 where day = '18';
	7.8 修复分区(也可以使用添加分区的语句)
		msck repair table dept_partition2;
8.创建外部表(删除表不会删除表中数据,仅删除表的元数据)
	create external table stu_ex2(id int, name string)
	ROW format delimited
	FIELDS terminated by '\t'
	location '/student';
	8.1 外部表与内部表的转换
		alter table stu_ex set TBLPROPERTIES ('EXTERNAL' = 'TRUE');
9.数据的导出
	9.1 导出同时格式化(不加local则导出到hdfs)
		insert overwrite local directory '/opt/module/datas/student'
		row format delimited
		fields terminated by '\t'
		select * from student;
	9.2 hadoop命令导出到本地
		dfs -get /user/hive/warehouse/student/month=201709/000000_0 /opt/module/datas/export/student3.txt;
	9.3 shell命令导出
		hive -f/-e 执行语句或者脚本 > file	-- -f跟文件,-e跟执行语句
	9.4 export仅可以导出到hdfs,常用于hdfs集群hive表迁徙
		export table default.student to '/user/hive/warehouse/export/student'; -- 同时会导出表的元数据
10.数据的导入(仅能导入export导出的数据,因为需要获取表的元数据)
	import table table_name from 'export导出数据的路径';
11.清除表中数据
	truncate table student; -- 只能删除管理表,不能删除外部表中数据
12.LikeRLikeRLike可以使用java的正则表达式
13.group byhaving的使用 -- hive中对于使用group by后查询字段仅限group by的字段及聚合函数
	select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
14.mapreduce的join	
	14.1 mapreduce中的reducejoin特点:在mapper阶段进行数据关联标记,在reducer阶段进行数据聚合
	14.2 mapreduce中的mapjoin特点:将小表加载到内存中,在mapper阶段根据内存中的数据对大表进行数据处理,没有reduce阶段
15.HQL的join
	15.1 仅支持等值连接不支持非等值连接
		例:不支持select * from A left join B on A.id != B.id;
	15.2 不支持在on条件中使用‘or15.3 每个join都会启动一个mapreduce任务,但hive默认开启mapreduce优化
		关闭mapreduce优化:set hive.auto.convert.join=false;
16.order by
	会进行全局排序,则reduce数量被看作1个,效率低下
17.sort by -- 局部排序
	对于每个mapreduce各分区进行局部排序,分区中的数据随机给定
18.distribute by
	18.1 即mapreduce中自定义分区操作,hql书写规则:先分区后排序  
	18.2 distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
19.cluster by
	当distribute和sort字段相同时可用cluster进行替代,默认正序,单不支持desc倒序
20.分桶 -- 分桶表的数据需要通过子查询的方式导入
	20.1 开启分桶的设置
		set hive.enforce.bucketing=true;
	20.2 分桶表的创建
		create table stu_buck(id int, name string)
		clustered by(id) 
		into 4 buckets
		row format delimited fields terminated by '\t';
	20.3 分桶的规则
		用分桶字段的hash值与桶的个数求余,来决定数据存放在那个桶,
	20.4 分桶与分区区别
		a. 分桶结果在表的目录下存在多个分桶文件
		b. 分区是将数据存放在表所在目录不同文件路径下
		c. 分区针对是数据存储路径,分桶针对的是数据文件,分桶可以在分区的基础粒度细化
21.分桶的抽样	
	21.1 抽样语法 -- 必须 x<=y
		select * from table_name tablesample(bucket x out of y on bucketKey); -- on bucketKey可不写
	21.2 抽样规则
		a. y用来决定抽样比例,必须为bucket数的倍数或者因子,
			例:bucket数为4时,当y=2时,4/2=2,则抽取两个桶的数据,具体抽取哪个桶由x决定
		b. x用来决定抽取哪个桶中的数据
			例1:当bucket=4, y=4, x=2时,则需要抽取的数据量为bucket/y=1个桶,抽取第x桶的数据
			例2:当bucket=4, y=2, x=2时,则需要抽取的数据量为bucket/y=2个桶,抽取第x桶和第x+y桶的数据
			例3:当bucket=12, y=3, x=2时,抽bucket/y=4个桶,抽取第x桶和第x+2y桶的数据
22.NVL函数
	NVL(column_name, default_cvalue),如果该行字段值为null,则返回default_value的值
23.CONCAT_WS()函数
	使用规则:concat_ws(separator, [string | array(string)]+)
	例:select concat_ws('_', 'www', array('achong','com')) 拼接结果:www_achong_com
24.COLLECT_SET(col)函数
	使用规则:仅接受基本数据类型,将字段去重汇总,并返回array类型
	例(行转列):表结构
			name	xingzuo     	  blood
			孙悟空	  白羊座	        A
			大海	  射手座	        A
			宋宋	  白羊座	        B
			猪八戒	  白羊座	        A
			凤姐	  射手座	        A
		需求:把星座和血型一样的人归类到一起
			射手座,A            大海|凤姐
			白羊座,A            孙悟空|猪八戒
			白羊座,B            宋宋
		查询语句:
			SELECT CONCAT_WS(',', xingzuo, blood), CONCAT_WS('|', COLLECT_SET(NAME))
			FROM xingzuo
			GROUP BY xingzuo, blood
25.EXPLODE(爆炸函数)及LATERAL_VIEW)(侧写函数)
	25.1 explode:将列中的array或者map结构拆分成多行 -- 一般需结合lateral_view使用
	25.2 lateral_view: LATERAL VIEW udtf(expression) 表别名 AS 列别名
	例(行转列)
		select movie, category_name
		from  movie_info 
		lateral view explode(category) table_tmp as category_name;
26.开窗函数 -- 常结合聚合函数使用,解决即需要聚合前的数据又需要聚合后的数据展示
	26.1 语法:UDAF() over (PARTITION By col1,col2 order by col3 窗口子句(rows between .. and ..) AS 列别名
			(partition by .. order by)可替换为(distribute by .. sort by ..26.2 over(): 指定分析数据窗口大小
	26.3 窗口子句 -- 先分区在排序然后接rows限定执行窗口
		26.3.01 n PRECEDING:往前n行数据
		26.3.02 n FOLLOWING:往后n行数据
			例:select name, orderdate, cost, sum(cost) over(
																partition by name 
																order by orderdate 
																rows between 1 PRECEDING and 1 FOLLOWING
															) from business;
		26.3.03 CURRENT ROW:当前行
		26.3.04 UNBOUNDED PRECEDING 表示从前面的起点
		26.3.05 UNBOUNDED FOLLOWING表示到后面的终点
			例:select name, orderdate, cost, sum(cost) over(
																partition by name 
																order by orderdate 
																rows between CURRENT ROW and UNBOUNDED FOLLOWING
															) from business;
27.LAG(col,n,default_val):往前第n行数据
28.LEAD(col,n, default_val):往后第n行数据
	例:select name, orderdate, cost, lag(orderdate, 1, 'null') over(partition by name order by orderdate)
		from business; -- 即获取前1行的orderDate数据
29.ntile(n):把有序分区中的行分为n组,每组编号从1开始 -- 分组规则详见:ntile的分组规则.sql
	例:select name,orderdate,cost, ntile(5) over(order by orderdate) num from business
30.Rank函数
	rank() 出现相同排序时,总数不变
	dense_rank() 出现相同排序时,总数减少
	row_number() 不会出现相同排序




sql执行顺序
	from... where...group by... having.... select ... order by...
	
hql执行顺序	
	fromwheregroup byhavingselectorder by … 或
	fromonjoinwheregroup byhavingselectdistinctorder bylimit
	存在开窗函数时,起码在order by之前执行

	
例题1-- 集合类型数据导入
	{
		"name": "songsong",
		"friends": ["bingbing" , "lili"] ,       //列表Array, 
		"children": {                      //键值Map,
			"xiao song": 18 ,
			"xiaoxiao song": 19
		}
		"address": {                      //结构Struct,
			"street": "hui long guan" ,
			"city": "beijing" 
		}
	}

	基于上述数据结构,我们在Hive里创建对应的表,并导入数据。
	1.1 格式化数据为:
		songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
		yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
	1.2 建表语句:
		create table test(name string, 
		friends array<string>,
		children map<string, int>,
		address struct<street:string, city:string>)
		row format delimited
		fields terminated by ','
		collection items terminated by '_'
		map keys terminated by ':';
	1.3 数据写入语句
		load data local inpath '/opt/module/datas/test.txt' into table test;
	1.4 查询语句
		select friends[0] friend,children['xiao song'] age,address.city from test where name = 'songsong';


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值