数据类型

分类类型描述范围和举例
原始类型booleantrue/falseTRUE, FALSE
原始类型tinyint1字节的有符号整数[-128, 127]
原始类型smallint2个字节的有符号整数[-32768, 32767]
原始类型int4个字节的带符号整数[-2147483648, 2147483647]
原始类型bigint8字节带符号整数[9223372036854775808, 9223372036854775807]
原始类型float字节单精度浮点数1.0[-3.40E+38, +3.40E+38]
原始类型double8字节双精度浮点数[-1.79E+308, +1.79E+38]
原始类型decimal任意精度的带符号小数
原始类型string字符串,变长
原始类型varchar变长字符串
原始类型char固定长度字符串
原始类型binary字节数组
原始类型timestamp时间戳,毫秒值精度1327882394
1327882394.123456789
YYYY-MM-DD hh:mm:ss.fffff
原始类型date日期'2018-04-07'
原始类型interval时间频率间隔
复杂类型array有序的的同类型的集合array(1,2)
复杂类型mapkey-value,key必须为原始类型,value可以任意类型map(‘a’,1,’b’,2)
复杂类型struct字段集合,类型可以不同struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
复杂类型union在有限取值范围内的一个值create_union(1,’a’,63)
存储格式
存储类型描述
textfiletextfile为默认格式,存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。
SequenceFile1、SequenceFile是Hadoop API提供的一种二进制文件支持,具有使用方便、可分割、可压缩的特点。
2、SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。
RCFile一种行列存储相结合的存储方式。
ORCFile数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。
hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快速列存取。
ParquetParquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。

数据格式

分隔符描述
\n对于文本文件来说,每行是一条记录,所以\n 来分割记录
^A (Ctrl+A)分割字段
也可以用\001 来表示
^B (Ctrl+B)用于分割 Arrary 或者 Struct 中的元素,或者用于 map 中键值之间的分割
也可以用\002 分割。
^C用于 map 中键和值自己分割,也可以用\003 表示。

内部表与外部表区别

区别\表类型内部表(MANAGED_TABLE)外部表(EXTERNAL_TABLE)
是否有EXTERNAL修饰
数据管理数据由 Hive 自身管理数据由 HDFS 管理
创建表时将数据移动到数据仓库指向的路径仅记录数据所在的路径,不对数据的位置做任何改变
删除表时直接删除元数据(metadata)及存储数据仅会删除元数据,HDFS上的文件并不会被删除

基础操作语句

查看所有库
show datebases;
切换
use database_name;
查看信息
desc datebase database_name;
-- 查看数据库的键值对信息
desc datebase extended database_name;
创建
create database if not exists database_name;
-- 指定hdfs存储路径
create database database_name location '/myhive2';
-- 指定键值对
create database database_name with dbproperties ('owner'='Zakikun', 'date'='20221002');
修改信息
alter database database_name set dbproperties ('owner'='Zakikun');

删除

-- 删除一个空数据库,如果数据库下面有数据表,那么就会报错
drop database database_name;

-- 强制删除数据库,包含数据库下面的表一起删除
drop database database_name cascad

创建
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] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]
-- 创建一个指定名字的表:如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常
CREATE TABLE 

-- 创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
-- 内部表: 数据移动到指定路径,删除内部表的时候会一并删除metadata和实际数据
-- 外部表:数据不移动,仅记录这个外部表数据所在的路径,删除该外部表的时候只删除metadata,不影响实际数据
EXTERNAL

-- 表示注释,默认不能使用中文
COMMENT

-- 表示使用分区,一个表可以拥有一个或者多个分区,每个分区单独存在一个目录下
PARTITIONED BY

-- 允许用户复制现有的表结构,但是不复制数据
LIKE

-- 可用来指定行分隔符,默认分隔符为 '^A' ,在八进制中为 '\001'
ROW FORMAT DELIMITED 

-- 指定该表数据的存储格式,hive 中,表的默认存储格式为 TextFile
STORED AS  SEQUENCEFILE | TEXTFILE | RCFILE | orc | PARQUET

-- 对于每一个表(table)进行分桶(MapReuce中的分区),桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
CLUSTERED BY

-- 指定表在 HDFS 上的存储路径
LOCATION

-- 指定压缩算法
tblproperties ('orc.compress'='SNAPPY')
删除
-- 习惯性加上if exists判断是否存在, 会将hdfs一并删除
drop table if exists table_name
查看表结构
-- 格式化表格
desc formatted table_name;
-- 简单表格
desc table_name;
查看分区信息
show partitions table_name;
复制表结构
CREATE TABLE if not exists new_table_name LIKE database.origin_table_name;
复制表(包括数据)
-- 方法1
CREATE TABLE if not exists new_table_name as select * from database.origin_table_name;

-- 方法2
CREATE TABLE if not exists new_table_name LIKE database.origin_table_name;
insert into new_table_name select * from database.origin_table_name;
alter table old_table_name rename to new_table_name;
清空表数据
truncate table table_name;
插入数据(追加)
-- 将查询数据追加插入到表中
insert into table table_name [partition(partcol1=val1,partclo2=val2)] select_statement;
插入数据(覆盖/重写)
-- 将查询数据覆盖插入到表中
insert overwrite table table_name [partition(partcol1=val1,partclo2=val2)] select_statement;

分区

增加分区

正常情况下需要分区不存在,如果为了防止分区存在报错可以加 IF NOT EXISTS 关键字

ALTER TABLE database.table_name ADD [IF NOT EXISTS] PARTITION (分区字段名 = 'XXX') LOCATION '$PATH'
删除分区
ALTER TABLE database.table_name DROP IF EXISTS PARTITION (分区字段名 = 'XXX');
修改分区
ALTER TABLE class_info_partition PARTITION (分区字段名 = 'XXX') SET LOCATION '$PATH' ;

字段

增加/创建
alter table table_name add columns(
    新增字段名 新增字段类型 comment '新增字段注释',
    新增字段名 新增字段类型 comment '新增字段注释'
    );
删除字段/反向保留
alter table table_name replace columns(
    保留字段1 保留字段类型1 comment '保留字段类型1注释',
    保留字段2 保留字段类型2 comment '保留字段类型2注释',
    保留字段3 保留字段类型3 comment '保留字段类型3注释',
    保留字段4 保留字段类型4 comment '保留字段类型4注释',
    保留字段5 保留字段类型5 comment '保留字段类型5注释',
    保留字段6 保留字段类型6 comment '保留字段类型6注释',
    ......
);
修改名称/类型/位置/注释
-- 修改字段名,类型,注释
alter table table_name change column 现字段名 修改后字段名 修改后类型 comment '修改后注释';

-- 修改后字段位置
alter table table_name change column 现字段1名 修改后字段1名 修改后类型 comment '修改后注释' after 改为在某字段后的某字段名;

数据

select
SELECT [ ALL | DISTINCT ] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING where_condition]
[ORDER BY col_list]
[CLUSTER BY col_list]
[DISTRIBUTE BY col_list]
[SORT BY col_list]
[LIMIT number]
join

full outer join 等价于 full join

with...as...
with temp1 as (
    select * from xxx
),temp2 as (
    select * from xxx
)
select * from temp1,temp2;
table_reference [INNER] JOIN table_factor [join_condition]
table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
table_reference LEFT SEMI JOIN table_reference join_condition
table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)
运算符
操作符支持的数据类型描述
A=B基本数据类型如果A等于B则返回TRUE,反之返回FALSE
A<=>B基本数据类型如果A和B都为NULL,则返回TRUE,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL
A<>B, 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>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 IS NULL所有数据类型如果A等于NULL,则返回TRUE,反之返回FALSE
A IS NOT NULL所有数据类型如果A不等于NULL,则返回TRUE,反之返回FALSE
IN(数值1, 数值2)所有数据类型使用 IN运算显示列表中的值
A [NOT] LIKE BSTRING 类型B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回TRUE;反之返回FALSE。
B的表达式说明如下:
‘x%’表示A必须以字母‘x’开头,
‘%x’表示A必须以字母’x’结尾,
而‘%x%’表示A包含有字母’x’,可以位于开头,结尾或者字符串中间。
如果使用NOT关键字则可达到相反的效果。
A RLIKE B, A REGEXP BSTRING 类型B是一个正则表达式,如果A与其匹配,则返回TRUE;反之返回FALSE。
匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。
例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。
逻辑运算符
操作符含义
AND逻辑并
OR逻辑或
NOT逻辑否
算术运算符
运算符类型描述
A + B所有类型A与B相加的结果,结果的数值类型等于A的类型和B的类型的最小父类型;
int+int一般结果为int类型
int+double一般结果为double类型
A – B所有类型A与B相减的结果。结果的数值类型等于A的类型和B的类型的最小父类型
A * B所有类型A与B相乘的结果。结果的数值类型等于A的类型和B的类型的最小父类型
A / B所有类型A除以B的结果。结果的数值类型为double
A % B所有类型A除以B的余数
A & B所有类型A和B按位进行与操作的结果
AB所有类型
A ^ B所有类型A和B按位进行异或操作的结果
~A所有类型A按位进行取反操作的结果,结果的数值类型等于A的类型
分组
group by
select s_id ,max(s_score) from score group by s_id;
having
select s_id ,avg(s_score) avgscore from score group by s_id having avgscore > 85;

where和having区别

having与where不同点
1.where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据
2.where后面不能写分组函数,而having后面可以使用分组函数
3.having只用于group by分组统计语句
排序
order by

全局排序

select s_id ,avg(s_score) avg from score group by s_id order by s_id,avg;

对 NULL 值的处理

-- 将 null 值列在最前
select * from student order by student.s_birth nulls first;

-- 将 null 值列在最后
select * from student order by student.s_birth nulls last;
Sort By

每个MapReduce内部局部排序

Distribute By

分区排序

cluster by
合并
union

去重合并select

union all

不去重合并select

常用函数

数值
运算符类型功能说明
round(double a)BIGINTHive四舍五入取整
round(double a, int d)DOUBLEHive指定保留小数点四舍五入
floor(double a)BIGINT对给定数据进行向下取最接近的整数
ceil(double a)
ceiling(double a)
BIGINT参数向上取最接近的整数
rand(), rand(int seed)double返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列
abs(double a)double取绝对值
positive(int a)
positive(double a)
double取绝对值
negative(int a)
negative(double a)
doubleA的相反数
时间
函数描述例子
current_date()当前日期
current_time()
datediff(string enddate, string startdate)时间差datediff('2020-05-29','1997-05-16')
date_add(string startdate, int days)日期加date_add('2020-05-29', 7)
date_sub(string startdate, int days)日期减date_sub('2020-05-29', 7)
to_date(string timestamp)返回时间中的年月日
from_unixtimeint型转时间戳
unix_timestamp()获得当前时区的UNIX时间戳
unix_timestamp(string date, string pattern)转换指定pattern格式的日期到UNIX时间戳
year(string date)返回指定时间的年份
month(string date)返回指定时间的月份
day(string date)返回指定时间的天
hour(string date)返回指定时间的小时
minute(string date)返回指定时间的分钟
second(string date)返回指定时间的秒
last_day(string date)指定日期字符所在月份的最后一天
条件判断
case 
  when age < 20 then '20岁以下'
  when age < 30 then '20-30岁'
  when age < 40 then '30-40岁'
  else '40岁以上'
end as age_type,
字符串
substr( stringA, INT start, INT len)
函数米醋
length(string A)返回字符串A的长度
reverse(string A)reverse(string A)
concat(string A, string B…)返回输入字符串连接后的结果,支持任意个输入字符串
concat_ws(string SEP, string A, string B…)返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
substr(string A, int start)返回字符串A从start位置到结尾的字符串
substring(string A, int start)返回字符串A从start位置到结尾的字符串
substr(string A, int start, int len)返回字符串A从start位置开始,长度为len的字符串
substring(string A, int start, int len)返回字符串A从start位置开始,长度为len的字符串
upper(string A)字符串转大写函数:upper,ucase
ucase(string A)字符串转大写函数:upper,ucase
lower(string A)字符串转小写函数:lower,lcase
lcase(string A)字符串转小写函数:lower,lcase
trim(string A)去除字符串两边的空格
ltrim(string A)去除字符串左边的空格
rtrim(string A)右边去空格函数:rtrim
regexp_replace(string A, string B, string C)将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数
regexp_extract(string subject, string pattern, int index)将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符
repeat(string str, int n)返回重复n次后的str字符串
split(string str, string pat)按照pat字符串分割str,会返回分割后的字符串数组
find_in_set(string str, string strList)返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0
locate(string substr, string str[, int pos])查找字符串str中的pos位置后字符串substr第一次出现的位置
数据类型转换
cast (value as type)

-- eg.
cast ('2019' as int)
最后修改:2022 年 11 月 03 日
个人分享,随意打赏