Hive SQL / SQL

  • [1. 建表 & 拉取表](#1. 建表 & 拉取表)
  • [2. 插入数据 insert + select](#2. 插入数据 insert + select)
  • [3. 查询](#3. 查询)
    • [3.1 查询语句语法/顺序](#3.1 查询语句语法/顺序)
    • [3.2 关系操作符](#3.2 关系操作符)
    • [3.3 聚合函数](#3.3 聚合函数)
    • [3.4 where](#3.4 where)
    • [3.5 分组聚合](#3.5 分组聚合)
    • [3.6 having 筛选分组后结果](#3.6 having 筛选分组后结果)
    • [3.7 显式类型转换 & select产生指定值的列](#3.7 显式类型转换 & select产生指定值的列)
  • [4. join 横向拼接](#4. join 横向拼接)
    • [4.1 等值连接 & 不等值连接](#4.1 等值连接 & 不等值连接)
    • [4.2 两表连接](#4.2 两表连接)
      • [4.2.1 内连接](#4.2.1 内连接)
      • [4.2.2 左外连接 & 右外连接](#4.2.2 左外连接 & 右外连接)
      • [4.2.3 满外连接](#4.2.3 满外连接)
    • [4.3 多表连接](#4.3 多表连接)
    • [4.4 笛卡尔积](#4.4 笛卡尔积)
  • [5. union 纵向拼接](#5. union 纵向拼接)
  • [6. 排序](#6. 排序)
    • [6.1 order by 全局排序](#6.1 order by 全局排序)
    • [6.2 sort by reduce内部排序](#6.2 sort by reduce内部排序)
  • [7. 其他](#7. 其他)
    • [7.1 select中判断筛选出null](#7.1 select中判断筛选出null)
      • [7.1.1 MYSQL ifnull](#7.1.1 MYSQL ifnull)
      • [7.1.2 Hive SQL if( , , )](#7.1.2 Hive SQL if( , , ))

1. 建表 & 拉取表

建表

sql 复制代码
create table student(
	name string, 
	age  BIGINT,
	subject array<string>, -- 学科
	score map<string, float>, -- 学科对应成绩
	address struct<houseNumber: int, street: string>
) 
row format delimited
fields terminated by "\t"; -- 列间隔符

加载数据

sql 复制代码
-- local 从本地加载,省略则从HDFS加载
load data local inpath '/root/covid/2020-02.csv' into table covid2020;
-- 加载数据到分区
load data inpath '/data/covid/2020-02.csv' into table covid2020 partition(dt='2020-02');

2. 插入数据 insert + select

sql 复制代码
-- overwrite 覆盖
-- into 追加
insert overwrite/into table table1
select id
	  ,name
from table2;
sql 复制代码
-- 一次查询,插入多个表或分区
from table2
insert into/overwrite table table1 partition(dt="01")
select_value1
insert into/overwrite table table1 partition(dt="02")
select_value2
;

3. 查询

3.1 查询语句语法/顺序

注意先后顺序

sql 复制代码
select all/distinct expr1
				    ,expr2
from table_name
where condition -- 过滤
group by condition -- 分组查询
having condition -- 分组后组内过滤
order by col_list -- 最终查询结果排序
limit number
offset number
;

3.2 关系操作符

sql 复制代码
-- <==> 都为null或都不为null,返回true
where A <==> B 

-- 判空,必须用is (not) null
-- 若string类型为"",则hive的is null判断反回为False
where job is null

-- in 集合
where job(col_name) in('研发', '销售')

3.3 聚合函数

多行数据一起计算,返回一行值

sql 复制代码
count(*) 统计行数,包含null
count(col_name) 统计指定列的行数,不包含null
max() 不包含null
min()
sum()
avg()

select count(*) from table1;

3.4 where

sql 复制代码
-- where 中可以使用函数
select * from table1 where length(name) > 5;
-- where中不能使用聚合函数

3.5 分组聚合

选择分组后,select字段只能选择 分组的字段(job)、聚合函数。

sql 复制代码
-- 分组后, 组内count(*)
select job
	   ,count(*)
from emp
group by job
;

3.6 having 筛选分组后结果

sql 复制代码
select job
	  ,count(*) cnt
from emp
group by job
having cnt >= 2;

-- 相当于
select job
	   ,cnt
from 
(
	select job
		  ,count(*) cnt
	from emp
	group by job
) t
where cnt >= 2;

3.7 显式类型转换 & select产生指定值的列

sql 复制代码
select
	'none' as none_col1,
	cast('none' as int) as none_col2

显示类型转换

cast('100' as int)

select cast(12.1 as int); >>> 12

4. join 横向拼接

4.1 等值连接 & 不等值连接

sql 复制代码
-- 等值连接
select 
	*
from table1
join table2
on table1.id = table2.id
;

-- 不等值连接
on 中不是"=", 早期版本hive 不支持不等值连接

4.2 两表连接

4.2.1 内连接

joininner join

两表连接字段的交集,不能join的行不显示。

sql 复制代码
select 
	tb1.name,
	tb2.name
from table1 tb1
join / inner join table2 tb2
on tb1.id = tb2.id;

4.2.2 左外连接 & 右外连接

left joinleft outer join

保留左表所有数据,右表补空。

右外连接 相反。

sql 复制代码
select 
	tb1.name,
	tb2.name
from table1 tb1
left/right join table2 tb2
on tb1.id = tb2.id;

4.2.3 满外连接

full joinfull outer join

保留两表左右,不能连接的字段补空。

sql 复制代码
select 
	tb1.name,
	tb2.name
from table1 tb1
full join table2 tb2
on tb1.id = tb2.id;

4.3 多表连接

sql 复制代码
select
	*
from table1
join table2
on table1.id = table2.id
join table3
on table2.name = table3.name
sql 复制代码
(
	select 
		id, name
	from stu_info
	where course_id = '01'
) t1
full outer join
(
	select 
		id, name
	from stu_info
	where course_id = '02'
) t2
on t1.id = t2.id
full outer join
(
	select 
		id, name
	from stu_info
	where course_id = '03'
) t3
-- 如果某id 不在t1中在t2中
-- 如果t1.id 为空则返回t2.id,如果不为空则返回t1.id
on nvl(t1.id, t2.id) = t3.id

4.4 笛卡尔积

sql 复制代码
select 
	*
from table1
join table2

-- 或
select 
	*
from table1, table2

5. union 纵向拼接

  1. 两表上下拼接,对应字段的数量、类型都必须相同;
  2. 对应字段名不一样,能连接上;最终字段名以第一个表的字段名为准;
  3. union 连接的必须是select查询语句;
  4. 连接完后,当成一个select查询使用就行;
  5. union all 不会对相同数据去重,union会对上下两部分相同部分去重。
sql 复制代码
select 
	*
from stu
where score = 30
union
select 
	*
from stu
where score = 40
;

6. 排序

6.1 order by 全局排序

默认升序(asc), desc 降序descend

hive 最终执行reduce时,只能一个reduce以实现全局排序,数据量大时order by不合适;

可以使用order by + limit n ,每个Map取出n个,减少了reduce时的压力

sql 复制代码
select
	*
from table1
order by col_name desc
;

6.2 sort by reduce内部排序

保证每个reduce内有序,全局不保证有序。

sql 复制代码
-- 设置reduce个数
set mapreduce.job.reduces=3;
-- 查看reduce个数
set mapreduce.job.reduces;

-- reduce内部排序
select
	*
from emp
sort by col_1 desc;

7. 其他

7.1 select中判断筛选出null

7.1.1 MYSQL ifnull

筛选出第二大的,但可能初筛排序后只有一个,再筛第二大为null

ifnull 指定为null时,替换为什么值。

sql 复制代码
select
	ifnull(
		(
			select
				salary
			from Employee
			order by salary desc
			limit 1
			offset 1
		)
		,null
	) as No2_highest_salary

7.1.2 Hive SQL if( , , )

如果column是null,返回第二个值,不是则返回第三个值

sql 复制代码
if(column is null, 'IS NULL', 'IS NOT NULL')
相关推荐
Lx3521 天前
Hadoop容错机制深度解析:保障作业稳定运行
大数据·hadoop
鸿乃江边鸟1 天前
向量化和列式存储
大数据·sql·向量化
IT毕设梦工厂1 天前
大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata
大数据CLUB1 天前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
计算机编程小央姐2 天前
跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
大数据·hadoop·信息可视化·spark·django·课程设计·食物
懒虫虫~2 天前
通过内存去重替换SQL中distinct,优化SQL查询效率
java·sql·慢sql治理
逛逛GitHub2 天前
1 个神级智能问数工具,刚开源就 1500 Star 了。
sql·github
IT学长编程2 天前
计算机毕业设计 基于Hadoop的健康饮食推荐系统的设计与实现 Java 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
java·大数据·hadoop·毕业设计·课程设计·推荐算法·毕业论文
Huhbbjs2 天前
SQL 核心概念与实践总结
开发语言·数据库·sql