目录
Load:
语法:
load实例:
Insert:
查询:
Limit语句:
案例1:
案例2:
关系运算函数:
1)基本语法
逻辑运算符:
1)基本语法(and/or/not)
(2)案例:
集合函数:
分组函数:
group by:
having:
Join:
排序:
order by:
每个Reduce内部排序(Sort By):
编辑分区(Distribute By):
分区排序(Cluster By)
Load可以将文件导入到hive表中(在导入的时候要注意文件的结构要与表的结构保持一致)
在使用本地路径的时候底层是put操作 复制到hive表中(本地路径是指hiveserver2所在的本地)
在使用默认情况下 是操作HDFS中数据,底层是移动HDFS文件
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)];
load data local inpath '/home/tangxiaocong/student.txt' into table student;
这里的into是追加的意思 在表的末尾进行添加
对上述实例添加overwrite:
表示覆盖的意思,把原来的数据进行覆盖
load data local inpath '/home/tangxiaocong/student.txt' overwrite into table student;
(1)将查询结果插入到表中
insert into table student1 select *from student;
(2)将给定的value插入表中
insert into table student1 values (211,'sds'),(253,'sd');
(3)将查询结果写入目标路径
注:路径最好是不存在的路径,因为这个语句是要使用overwrite(覆盖)会覆盖原有数据
insert overwrite directory '/txc/select'
select * from student1;
查询语法:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference -- 从什么表查
[WHERE where_condition] -- 过滤
[GROUP BY col_list] -- 分组查询
[HAVING col_list] -- 分组后过滤
[ORDER BY col_list] -- 排序
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number] -- 限制输出的行数
一些与mysql相同的语法就不在此介绍,如果有需要请查看数据库专栏
典型的查询会返回多行数据。limit子句用于限制返回的行数。
只查询前五行
select * from emp limit 5;
从第二行开始(不带第二行)向下查询3行(3,4,5行---索引查找所以左开右闭区间)
select * from emp limit 2,3;
如下操作符主要用于where和having语句中。
操作符 |
支持的数据类型 |
描述 |
A=B |
基本数据类型 |
如果A等于B则返回true,反之返回false |
A<=>B |
基本数据类型 |
如果A和B都为null或者都不为null,则返回true,如果只有一边为null,返回false |
A<>B, A!=B |
基本数据类型 |
A或者B为null则返回null;如果A不等于B,则返回true,反之返回false |
A |
基本数据类型 |
A或者B为null,则返回null;如果A小于B,则返回true,反之返回false |
A<=B |
基本数据类型 |
A或者B为null,则返回null;如果A小于等于B,则返回true,反之返回false |
A>B |
基本数据类型 |
A或者B为null,则返回null;如果A大于B,则返回true,反之返回false |
A>=B |
基本数据类型 |
A或者B为null,则返回null;如果A大于等于B,则返回true,反之返回false |
A [not] between B and C |
基本数据类型 |
如果A,B或者C任一为null,则结果为null。如果A的值大于等于B而且小于或等于C,则结果为true,反之为false。如果使用not关键字则可达到相反的效果。(A位于[B,C]之间为true) |
A is null |
所有数据类型 |
如果A等于null,则返回true,反之返回false |
A is not null |
所有数据类型 |
如果A不等于null,则返回true,反之返回false |
in(数值1,数值2) |
所有数据类型 |
使用 in运算显示列表中的值 |
A [not] like B |
string 类型 |
(模糊匹配% _) B是一个SQL下的简单正则表达式,也叫通配符模式,如果A与其匹配的话,则返回true;反之返回false。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母‘x’结尾,而‘%x%’表示A包含有字母‘x’,可以位于开头,结尾或者字符串中间。如果使用not关键字则可达到相反的效果。 |
A rlike B, A regexp B |
string 类型 |
(A是一个字段,B是一个正则表达式)B是基于java的正则表达式,如果A与其匹配,则返回true;反之返回false。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。 |
操作符 |
含义 |
and |
逻辑并 |
or |
逻辑或 |
not |
逻辑否 |
select * from emp where ename like "张%" or ename like "赵%";
补充个知识点:count函数的参数
select count(*) c3 from emp;
select count(3) c3 from emp;
上述两行代码返回的结果是相同的
select job ,count(1) person from emp group by job;
注:我们在查询的时候只能查询聚合函数或者分组字段(因为我们先进行分组,分组后元素只是分组字段相同,其他字段不一定相同不可查询,而且使用聚合函数后只有一行,无法显示多行数据)
having是组内过滤(条件过滤),对已经分好组的数据进行过滤
注:having只可以用于group by
where不可作用于group by
join是横向连接形成一张虚拟表,在连接的时候有等值连接也有不等值连接,而且在连接的时候要有相同的字段进行相连。
等值连接:
等值连接:顾名思义就是连接条件相等
select * from emp join dept on dept.deptno=emp.deptno;
不等值连接:应用场景不是很多,就是连接条件不相等的
连接还有内连接,左外连接,右外连接,满外连接,出现上述不同种连接主要是根据在两个表进行连接的时候出现不匹配的数据的处理情况而区分的。
内连接:
内连接是只在联合表中出现连接上的数据
select * from emp inner join dept on dept.deptno=emp.deptno;
左外连接:
左外连接是在联合表中出现连接上的数据与左表中没有连接上的数据(没有的数据自动补null)
select * from emp left join dept on dept.deptno=emp.deptno;
右外连接:
右外连接与左外连接基本相同,只是依赖的表发生了改变
满外连接:
满外连接返回的是两个表匹配上的部分,同时也输出两个表没有匹配的部分
关键字是 full join
select * from emp full join dept on dept.deptno=emp.deptno;
多表连接:
多表连接的执行逻辑是先join两张表,联合成一张表,再与第三张表进行连接
select
*
from emp
join dept
on emp.deptno=dept.deptno
join location
on dept.loc=location.loc;
笛卡尔积:
笛卡尔积就是A表(m行)中的每一行都会与B表(n行)中的数据进行连接匹配
最终生成mn行数据的联合表
笛卡尔积产生条件:
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接
连接(Union&Union all):
join是横向拼接,Union是纵向拼接。
使用Union的时候要保持两个表的字段数是一致的,字段的类型也要前后一致
Union连接的一定要是select查询语句
Union是分类型的(1)Union---去重 (2)Union all ---不去重的
order by是用于全局排序,只有一个reduce
order by在不与limlt联合使用的时候,会把所有数据都传入一个reduce中进行大排序(消耗资源浪费时间)
order by通常与limit进行结合使用,使用limit可以明显减轻reduce的工作任务,在使用limit 100 的时候会在每个的maptask中先取出前100行 传给reduce 这样reduce就只需要处理 100*n(maptask的数目)条数据
sort by是局部排序,在大数据量的时候需要我们开多个reduce的时候,sort by是对每个reduce进行排序
根据查询结果可以知道是局部有序:
set mapreduce.job.reduce=3;
select * from emp sort by deptno desc;
指定分区字段(shuffle阶段的分区)
启动几个reduce会开出几个分区
Cluster By是在分区字段与排序字段是同一个字段的时候可以简写为Cluster By