=--等号<>--不等<<=--小于(等于)>>=--大于(等于)is(not)null--(不)为空--模糊关系(not) A like B --B中占位符:_(一位数) %(不确定位数)rlike--可使用java中的任意正则表达式(eg: rlike '^\\d+$' --是否全为数字)regexp--功能与rlike相同
3. 算术运算符
+-*/%--取余&--按位与|--按位或^--按位异或~--按位非
4. 逻辑运算符
A and B --如果A和B都是true,否则false&&--类似于A and Bor--如果A或B或两者都是true 返回true,否则false||--类似A or Bnot!--!A, 类似于 not A
5. 集合运算
union--并集,有去重效果unionall--并集,不去重--hive中不支持表的减法运算,我们一般通过(not) in 来实现差集/补集/交集...--差集set hive.mapred.mode=nonstrict;set hive.strict.checks.cartesian.product =false;###设置非严格模式##求product_1中特有的select*from hive_4_product_1
where product_id notin(select product_id from hive_4_product_2);--对称差SELECT*FROM hive_4_product_1
WHERE product_id NOTIN(SELECT product_id FROM hive_4_product_2)UNIONSELECT*FROM hive_4_product_2
WHERE product_id NOTIN(SELECT product_id FROM hive_4_product_1)--交集SELECT*FROM hive_4_product_1
WHERE product_id IN(SELECT product_id FROM hive_4_product_2)
join--内连接leftouterjoin--左外连接rightouterjoin--右外连接fullouterjoin--全外连接left semi join--左半连接--左半连接例子(下面两段sql等效)--eg01selectuser.id,user.name fromuserleft semi join post
on(user.id=post.uid);--eg02select id,name fromuserwhere id in(select uid from post);
六、DDL
数据定义语言:常用的有CREATE和DROP,用于在数据库中创建新表或删除表,以及为表加入索引等
1. 对database操作
1) 创建数据库
--创建数据库/*
--基础语法
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
*/createdatabase db_name;createdatabaseifnotexists db_name;--当数据库不存在时创建createdatabaseifnotexists db_name comment'this is test db';--创建是添加备注createdatabase db_name location '/hive/db/db_name';createdatabase db_name with dbproperties('name'='dachun','date'='20200202');--设置数据库属性,添加了<创建人,创建时间>
--基本语法CREATE[EXTERNAL]TABLE[IFNOTEXISTS] table_name
[(col_name data_type [COMMENT col_comment],...)][COMMENT table_comment][PARTITIONED BY(col_name data_type [COMMENT col_comment],...)][CLUSTEREDBY(col_name, col_name,...)[SORTED BY(col_name [ASC|DESC],...)]INTO num_buckets BUCKETS][ROW FORMAT row_format][STORED AS file_format][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value,...)][AS select_statement]--------------->(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;
用户可以用 IFNOTEXISTS 选项来忽略这个异常。
-->(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实
际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外
部表只删除元数据,不删除数据。
-->(3)COMMENT:为表和列添加注释。-->(4)PARTITIONED BY 创建分区表-->(5)CLUSTERED BY 创建分桶表-->(6)SORTED BY 不常用,对桶中的一个或多个列另外排序-->(7)ROW FORMAT
DELIMITED [FIELDSTERMINATEDBYchar][COLLECTION ITEMS TERMINATEDBYchar][MAP KEYSTERMINATEDBYchar][LINESTERMINATEDBYchar]| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value,...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW
FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需
要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表
的具体的列的数据。
SerDe 是 Serialize/Deserilize 的简称, hive 使用 Serde 进行行对象的序列与反序列化。
-->(8)STORED AS 指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列
式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED
AS SEQUENCEFILE。
-->(9)LOCATION :指定表在 HDFS 上的存储位置。-->(10)AS:后跟查询语句,根据查询结果创建表。-->(11)LIKE 允许用户复制现有的表结构,但是不复制数据。
2° 常用语句
--默认创建管理表(内部表)--存储位置由配置项hive.metastore.warehouse.dir所定义的目录的子目录下createtableifnotexists student(
id int,
name string
)row format delimited fieldsterminatedby'\t'
stored as textfile
location '/user/hive/warehouse/student';--根据查询结果创建表(包括数据和表结构)createtableifnotexists student2 asselect id, name from student;--根据已经存在的表结构创建表(仅表结构)createtableifnotexists student3 like student;
if(boolean testCondition, T valueTrue, T valueFalseOrNull)--当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNullselectCOALESCE(null,'100','50')from tableName;--return 100, 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULLcase a when b then c [when d then e]*[else f]end--如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回fcasewhen a then b [when c then d]*[else e]end--如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e
5. 聚合函数
count(distinct/all)sum()avg()min()max()
6. 窗口函数
--基础语法<窗口函数>over([partitionby<分组字段>]orderby<排序字段>[rowsbetween 开始位置 and 结束位置])/*
针对窗口大小除了使用rows之外还可以通过以下方式:
order by 字段名 range/rows 边界规则0/between 边界规则1 and 边界规则2
注:默认框架将采用 RANGE UNBOUNDED PRECEDING AND CURRENT ROW(表示当前行以及一直到第一行的数据)
边界规则:
current row --当前行
n preceding --往前n行数据,包含当前行
UNBOUNDED PRECEDING --一直到第一条记录,包含当前行
n FOLLOWING --往后n行数据,包含当前行
UNBOUNDED FOLLOWING --一直到最后一条记录,包含当前行
PS: RANGE 只支持使用 UNBOUNDED 和 CURRENT ROW 窗口框架分隔符。
eg:
1.第一行到当前行
ORDER BY score desc rows UNBOUNDED PRECEDING
2.第一行到前一行(不含当前行)
ORDER BY score desc rows between UNBOUNDED PRECEDING and 1 PRECEDING
3.第一行到后一行(包含当前行)
ORDER BY score desc rows between UNBOUNDED PRECEDING and 1 FOLLOWING
4.当前行到最后一行
ORDER BY score desc rows between CURRENT ROW and UNBOUNDED FOLLOWING
注意,这种写法是错误的
ORDER BY score desc rows UNBOUNDED FOLLOWING -- 错误示范
5.前一行到最后一行(包含当前行)
ORDER BY score desc rows between 1 PRECEDING and UNBOUNDED FOLLOWING
6.后一行到最后一行(不含当前行)
ORDER BY score desc rows between 1 FOLLOWING and UNBOUNDED FOLLOWING
7.前一行到后一行(包含当前行)
ORDER BY score desc rows between 1 PRECEDING and 1 FOLLOWING
*/
a. 聚合类窗口函数
count()over()sum()over()avg()over()min()over()max()over()
eg:
select
deptno,sum(sal)over(partitionby deptno orderby sal desc) my_window_name as sum_sal,max(sal)over(partitionby deptno orderby sal desc) my_window_name as max_sal,min(sal)over(partitionby deptno orderby sal desc) my_window_name as min_sal,avg(sal)over(partitionby deptno orderby sal desc) my_window_name as avg_sal
from scott.emp
window my_window_name as(partitionby deptno orderby sal desc)
--1. 简介/*
map-join会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce运行的时间
*/--2. 使用方式SELECT/*+ MAPJOIN(b) */ a.key, a.valueFROM a JOIN b
ON a.key= b.key;--3. 涉及参数/*
1、小表自动选择Mapjoin
set hive.auto.convert.join=true;
默认值:false。该参数为true时,Hive自动对左边的表统计量,若是小表就加入内存,即对小表使用Map join
2、小表阀值
set hive.mapjoin.smalltable.filesize=25000000;
默认值:25M
hive.smalltable.filesize (replaced by hive.mapjoin.smalltable.filesize in Hive 0.8.1)
*/