Hive必须了解的技能有哪些?万字博客带你掌握Hive❤️还收藏干嘛,愣着啊!
Posted 报告,今天也有好好学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive必须了解的技能有哪些?万字博客带你掌握Hive❤️还收藏干嘛,愣着啊!相关的知识,希望对你有一定的参考价值。
创作不易,大家点个赞再走嘛!
目录
推荐收藏的Hive语言大全
必须要看的前言
收藏本篇文章,意味着你拥有了一份超级完善的Hive语言书籍。本篇博客涵盖了几乎所有mysql知识点,文末也给出了一些编写Hive时的一些优化建议。你也可以把这篇博客当作一本小“词典”,遇到遗忘了的知识点也随时可以查阅。总而言之,希望大家喜欢这篇博客,也更希望这篇博客能给大家带来帮助。
一、入门需知
1 创建数据库
1.1 创建数据库
create database if not exists csdn_test;
其中if not exists
可以不写,但如果已经存在了csdn_test这个数据库就会报错。
1.2 查看数据库
show databases;
1.3 删除数据库
删除空数据库 drop database 数据库名;
drop database csdn_test;
为防止删除的数据库不存在发生报错,最好采用if exists
判断数据库是否存在。
drop database if exists csdn_test;
如果数据库不为空,但又想删除怎么办?在最后加个cascade。
drop database csdn_test cascade;
1.4 进入数据库
use csdn_test;
2 Hive数据类型
2.1 数字类
类型 | 长度 | 备注 |
---|---|---|
TINYINT | 1字节 | 有符号整型 |
SMALLINT | 2字节 | 有符号整型 |
INT | 4字节 | 有符号整型 |
BIGINT | 8字节 | 有符号整型 |
FLOAT | 4字节 | 有符号单精度浮点数 |
DOUBLE | 8字节 | 有符号双精度浮点数 |
DECIMAL | – | 可带小数的精确数字字符串 |
1字节可以存8个0/1。
2.2 日期时间类
类型 | 长度 | 备注 |
---|---|---|
TIMESTAMP | – | 时间戳,内容格式:yyyy-mm-dd hh:mm:ss[.f…] |
DATE | – | 日期,内容格式:YYYY- MM- DD |
INTERVAL | – | – |
这里的时间戳可以理解为离具体指定的某个时间点相差的时间(精确到秒)。
2.3 字符串类
类型 | 长度 | 备注 |
---|---|---|
STRING | – | 字符串 |
VARCHAR | 字符数范围1 - 65535 | 长度不定字符串 |
CHAR | 最大的字符数:255 | 长度固定字符串 |
2.4 Misc类
类型 | 长度 | 备注 |
---|---|---|
BOOLEAN | – | 布尔类型 TRUE/FALSE |
BINARY | – | 字节序列 |
2.5 复合类
类型 | 长度 | 备注 |
---|---|---|
ARRAY | – | 包含同类型元素的数组,索引从0开始 ARRAY<data_type> |
MAP | – | 字典 MAP<primitive_type, data_type> |
STRUCT | – | 结构体 STRUCT<col_name : data_type [COMMENT col_comment],…> |
UNIONTYPE | – | 联合体UNIONTYPE<data_type, data_type, …> |
这些的联合体需要说一下,MAP类型就像Python中的DICT字典型数据,都是一个关键字key对应一个关键值value;UNIONTYPE 类型的数据可以存放任何数据,包括字符串类、数组型和MAP型等。后面会有例子详细说明。
3 Hive建表
首先需要说明的是,Hive建表的时候可以选择建立内部表或者是外部表。而内部表和外部表的区别主要如下。
- 从数据管理来看,内部表主要是由Hive自身管理,而外部表需要由HDFS管理;
- 从数据存储的位置来看,内部表数据是在/user/hive/warehouse,外部表则是可以通过LOCATION关键词来指定存储位置,不然默认也是和内部表存储位置相同;
- 从删除表来看,删除内部表时可以直接删除元数据及存储数据,而删除外部表仅仅会删除元数据;
- 从修改表来看,内部表的修改会直接同步给元数据,而外部表需要进行修复操作(MSCK REPAIR TABLE table_name;)
3.1 直接建表法
先给大家列一个建表的语句格式:
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]
看着有点乱?没关系,我们待会会一个个提到。
注意下面语句中如果已存在相同名字的表,会报错。
create table test_Create_Table(id int,name string);
--查看当前库表名
show tables;
--查看建表信息
show create table test_Create_Table;
--查看表结构
desc test_Create_Table;
和创建数据库一样,IF NOT EXIST可以忽略同名表的异常问题。
create table if not exists test_Create_Table(id int,name string);
EXTERNAL ,可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
--不指定路径,同内表路径一致
create external table test_External_Table(id int,name string);
--指定路径创建外部表(要求为新建路径)
create external table test_External_Location(id int, name string) location '/new_dir';
LIKE,可以复制表的结构,但注意并没有复制表中的数据。感觉很容易理解:创建一个像…的表。
create table test_like like test_create_table;
COMMENT,就是给表或者字段添加描述。
create table table_Comment(id int comment '编号',name string comment '姓名') comment '员工信息表';
PARTITIONED BY,用于指定分区,后文会详细讲解分区和分桶。
ROW FORMAT,这里是指行数据的格式,后文也会专门讲解。
STORED AS,如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
LOCATION,指定表在HDFS的存储路径。
CLUSTERED,表示的是按照某列聚类,例如在插入数据中有两项“张三,数学”和“张三,英语”。若是CLUSTERED BY name,则只会有一项,“张三,(数学,英语)”,这个机制也是为了加快查询的操作。
3.2 查询建表法
create table NewTableBySelect as select * from test_create_table;
需要注意的是,这里select 中选取的列名会作为新表的列名(所以通常是要取别名),会改变表的属性、结构,比如只能是内部表、分区分桶也没了;另外,select 中选取的列名会作为新表的列名(所以通常是要取别名),会改变表的属性、结构,比如只能是内部表、分区分桶也没了。同时,目标表不允许使用外部表,会报错创建的表存储格式会变成默认的格式 TEXTFILE ,不过可以指定表的存储格式,行和列的分隔符等。
3.3 like建表法
这里在3.1 介绍like的时候说过了。
反正大体上建表就是这几种方法,大家要先掌握好。
4 分隔符
4.1 字段分隔符
语法:fields terminated by '\\t'
(hive 默认的字段分隔符为ascii码的控制符 \\001 ctrl + V+A)
--设置字段分隔符
create table test_delimit(id int, name string) row format delimited fields terminated by '^B';
--查看字段分隔符
desc formatted test_delimit;
我们可以运行看一下。
可以看到,这里的分隔符信息出现了我们设置好的^B。当然,你想设置啥都可以。
4.2 array 类型成员分隔符
语法:collection items terminated by ','
数组分分隔符一般都是设置为逗号。
我们运行个例子看看结果。
已知"C:\\Users\\24721\\Desktop\\"
目录下的data1.txt文件内容为:
123|华为Mate10|1235,345
456|华为Mate30|89,635
789|小米5|452,63
1235|小米6|785,36
4562|OPPO Findx|7875,3563
现在我们要做的就是建立一个表,并且把这个文件中的数据正常导入到该表中,具体实现代码如下。
--指定 |为字段分隔符 ,为数组分隔符
create table sales_info(
sku_id string comment '商品id',
sku_name string comment '商品名称',
id_array array<string> comment '商品相关id列表')
row format delimited fields terminated by '|'
collection items terminated by ',' ;
--装载本地文件到 sales_info中
load data local inpath "C:\\Users\\24721\\Desktop\\data1.txt" overwrite into table sales_info;
--通过查询语句查看数据
select * from sales_info;
结果如下:
4.3 map:Key和Value之间的分隔符
语法:map keys terminated by ':'
我们在举一个例子:已知"C:\\Users\\24721\\Desktop\\"
下的data2.txt中的内容如下:
123|华为Mate10|id:1111,token:2222,user_name:zhangsan1
456|华为Mate30|id:1113,token:2224,user_name:zhangsan3
789|小米5|id:1114,token:2225,user_name:zhangsan4
1235|小米6|id:1115,token:2226,user_name:zhangsan5
4562|OPPO Findx|id:1116,token:2227,user_name:zhangsan6
现在我们要做的就是建立一个表,并且把这个文件中的数据导入到该表中,具体实现代码如下。
--创建含有map类型的数据表
create table mapkeys(
sku_id string comment '商品id',
sku_name string comment '商品名称',
state_map map<string,string> comment '商品状态信息')
row format delimited
fields terminated by '|'
map keys terminated by ':';
--将本地data2.txt数据加载到mapkeys表
load data local inpath "C:\\Users\\24721\\Desktop\\data2.txt" overwrite into table mapkeys;
--查看表内数据是否与文件一致
select * from mapkeys;
运行结果如下:
如图,建表插入数据成功。
但大家仔细看的话可以发现,state_map字段中的只有一个key(“id”),剩下全被当作value。这很明显不是我们最终想要的。那怎么办,我们可以加上一个collection items terminated by ','
。
具体如下:
--创建含有map类型的数据表
create table mapkeys2(
sku_id string comment '商品id',
sku_name string comment '商品名称',
state_map map<string,string> comment '商品状态信息')
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':';
--将本地data2.txt数据加载到mapkeys表
load data local inpath "C:\\Users\\24721\\Desktop\\data2.txt" overwrite into table mapkeys2;
--查看表内数据是否与文件一致
select * from mapkeys2;
此时的结果才是我们想要的。
4.4 行分隔符
语法:lines terminated by '\\n'
。
建表时得放在最后,不过这个建表时一般没有人写上去,因为目前默认"\\n"同时也只支持"\\n"。
4.5 使用多字符作为分隔符
- 使用MultiDelimitSerDe的方法来实现
--创建多分隔符表
CREATE TABLE test_MultiDelimit(id int, name string ,tel string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' WITH SERDEPROPERTIES ("field.delim"="##")
STORED AS TEXTFILE;
--查看表
desc formatted test_MultiDelimit;
运行结果如下:
- 使用RegexSerDe的方法实现,但注意RegexSerDe仅支持字符串类型的,不能有其他类型。
CREATE TABLE test1(id string, name string ,tel string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "^(.*)\\\\#\\\\#(.*)$")
STORED AS TEXTFILE;
5 分区表创建
这部分是我在上一篇博客中的Hive数据模型就提到了的,可以说着部分是Hive较为特色的部分。
5.1 使用分区表的意义
使用分区表的意义大致如下:使用分区技术,避免hive全表扫描,提升查询效率;同时能够减少数据冗余进而提高特定(指定分区)查询分析的效率。
注意,在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名为“分区键=键值”。你可以把建立分区想象成我建了个文件夹,把一些相似(或者说你想要的类型)的数据存放到文件夹中。
分区表这么好用,所以查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。
5.2 分区表类型
分区表类型:静态分区和动态分区。区别在于前者是我们手动指定的,后者是通过数据来判断分区的。
5.3 建立分区
静态分区和动态分区的建表语句是一样的。
注意:PARTITIONED BY ()
括号中指定的分区名不能跟表中的字段名一样。
-- 创建分区表 PARTITIONED BY (分区字段名 分区字段类型)
create table test_partition1(
sku_id string comment '商品id',
sku_name string comment '商品名称')
PARTITIONED BY (sku_class string);
--建立分区表之后,此时没有数据,也没有分区,需要建立分区
--创建分区
alter table test_partition1 add partition(sku_class='xiaomi') ;
--查看表现有分区
show partitions test_partition1;
此时分区test_partition1以及建好。
当然,我们可以通过多字段分区,具体如下。
-- 创建分区表 PARTITIONED BY (分区字段名 分区字段类型,分区字段名2 分区字段类型2) 多字段分区
create table test_partition_mul(
sku_id string comment '商品id',
sku_name string comment '商品名称')
PARTITIONED BY (sku_class string,sku_lable string);
--添加分区
alter table test_partition_mul add IF NOT EXISTS
partition(sku_class='xiaomi',sku_lable='dianzi');
--查看现有分区
show partitions test_partition_mul;
此时分区test_partition_mul以及建好。
往静态分区添加数据的语句如下:
insert into table test_partition_mul
partition(sku_class='xiaomi',sku_lable='dianzi') values('001','xiaomi1');
insert into table test_partition_mul
partition(sku_class='xiaomi',sku_lable='dianzi') select sku_id,sku_name from sales_info;
不过使用insert插入数据的速度往往会偏慢,大家可以采用load data
的方法加载本地文件到分区表中。
load data local inpath '本地文件路径' into table test_partition partition (sku_class='xiaomi',sku_lable='dianzi');
动态分区插入数据的方法如下:
insert into table test_partition_mul partition(sku_class,sku_lable) values ('001','xiaomi2','xiaomi','dianzi');
5.4 删除分区 drop
语法:alter table 表名 drop partition(分区字段名=取值);
alter table test_partition1 drop partition(sku_class='xiaomi');
--查看分区:
show partitions test_partition1;
此时说明删除成功。
6 分桶表创建
为什么要有分桶技术?分桶是啥意思,有啥作用?分区和分桶的区别有哪些?
这就给你一一解答。
- 当单个分区或者表中的数据量越来越大的时候,分区不能更细粒地划分数据时,可以采用分桶技术进行更细粒度的划分和管理;
- 分桶的实质其实就是对分桶的字段做了hash,然后存放到对应的文件中;
- 分桶可以提高join查询效率,方便进行抽样;
至于分桶和分区的区别呢,主要有一下几个地方:
- 分区使用的是表外字段,而分桶使用的是表内字段(也就是说分区时分区名不能取表字段名,而分桶是得指定表字段名吗);
- 分桶是更细粒度的划分、管理数据,更多用来做数据抽样、JOIN操作;
- 分桶随机分割数据库,而分区是非随机分割数据库;
- 分桶是对应不同的文件(细粒度),而分区是对应不同的文件夹(粗粒度);
- 普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,同表对应的是目录里的文件。
如果到这没听懂,没关系,接着往下看。
语法:create table 表名(字段1 类型1,字段2,类型2 ) clustered by(表内字段) sorted by(表内字段) into 分桶数 buckets
--创建分桶表
create table test_buckets(
sku_id string comment '商品id',
sku_name string comment '商品名称')
clustered by(sku_id) into 3 buckets;
但记得先设置自动分桶开关:
set hive.enforce.bucketing=true;
添加数据到分桶表:
insert into test_buckets select sku_id,sku_name from sales_info;
7 非hive环境下执行hql
虽然内容很简单,但是还是得介绍一下。
怎么执行一堆命令,可以将hql语句放到一个文件中,采用hive -f "文件路径"
即可,注意这个是在非hive环境下运行。
而hive -e "hql语句"
则是直接执行hive语句。
二、Hive操作语言
1 加载数据
1.1 从本地装载数据
这个其实在前面也已经提到了。
普通表:load data local inpath '数据文件路径' [overwrite] into table 表名 ;
其中overwrite表示覆盖原有数据,没有的话则表示添加数据。
load data local inpath 'E:hadoop/datas/payments.txt' into table payments;
分区表:load data local inpath '数据文件路径' [overwrite] into table 表名 partition (分区字段=值);
load data local inpath 'E:hadoop/datas/product_category_level1.txt' into table product_category partition(level=1);
分桶表:load data local inpath '数据文件路径' [overwrite] into table 表名;
--开启分桶功能
set hive.enforce.bucketing=true;
-- 忽略掉安全检查
hive.strict.checks.bucketing=false;
load data local inpath 'E:hadoop/datas/shop.txt' into table shops;
1.2 从HDFS加载数据
- cmd上传到HDFS文件系统中。
语法:hdfs dfs -put 本地文件路径 hdfs路径
hdfs dfs -put "C:\\Users\\24721\\Desktop\\product_info.txt" "/datas"
- 文件数据加载到Hive表中。
语法:load data inpath 'hdfs数据文件路径' into table 表名;
load data inpath '/datas/product_info.txt' into table product_info;
同理分区表要指定分区,分桶表与普通表加载数据一样。
2 插入数据
2.1 普通表
语法:insert into 表名 values(值)
或者insert overwrite 表名 values(值)
。
2.2 分区表
静态分区:
insert into test_partition1 partition(sku_class="xiaomi") values(1,'sku_new');
动态分区:
insert into test_partition1 partition(sku_class) values(1,'sku_new','苹果');
2.3 分桶表
语法:insert into 分桶表表名
insert into test_buckets values(1,'sku_new');
3 导出数据
3.1 导出到本地文件系统
语法:INSERT OVERWRITE LOCAL DIRECTORY '文件夹路径' ROW FORMAT DELIMITED FIELDS TERMINATED by '字段分隔符' 查询语句;
PS: 会重写指定文件夹 (一定要小心覆盖掉有用的文件),有新建文件夹功能, 导出的文件都名都为000000_0。另外,默认分隔符是用系统指定的,和本身建表语句指定的没有关系。
INSERT OVERWRITE LOCAL DIRECTORY 'E:/hadoop/datas/test_output' ROW FORMAT DELIMITED FIELDS TERMINATED by '\\t' select * from sales_info;
3.2 导出到HDFS
语法:INSERT OVERWRITE DIRECTORY '文件夹路径' 查询语句;
与导出到本地文件系统相比,少了个local。
4 删除表
4.1 删除所有数据
语法:truncate table 表名
使用truncate仅可删除内部表数据,不可删除表结构。
(就相当于你有个房子,现在只是把里面的东西都搬走,但是房子的架构啥的都没变)。
truncate table byselect;
使用cmd删除外部表数据(hdfs dfs -rm -r 外部表路径):
hdfs dfs -rm -r /datas/test_Exteranl/*
4.2 删除表部分数据
有partition表
- 删除具体partition
语法:alter table table_name drop partition(partiton_name='value'))
--查看数据
select * from test_partition1;
show partitions test_partition1;
--删除指定分区
alter table test_partition1 drop partition(sku_class = 'xiaomi');
- 删除partition内的部分信息(
INSERT OVERWRITE TABLE
)
INSERT OVERWRITE TABLE test_partition_mul
PARTITION(sku_class='xiaomi',sku_lable='dianzi')
SELECT sku_id,sku_name FROM test_partition_mul
WHERE sku_id='1235';
重新把对应的partition信息写一遍,通过WHERE 来限定需要留下的信息,没有留下的信息就被删除了。
无partiton表
语法:INSERT OVERWRITE TABLE 表名 SELECT * FROM 表名 WHERE 条件;
。
--插入测试数据
insert into sales_info(sku_id,sku_name) values(1,'a');
--删除不为2的数据
insert overwrite table sales_info(sku_id,sku_name) select sku_id,sku_name from sales_info where sku_id='2';
删除整个表
使用drop可删除整个表(drop table 表名)
drop table test_external;
三、Hive查询语言
1 内置运算符
1.1 关系运算符
运算符 | 操作 | 描述 |
---|---|---|
A = B | 所有基本类型 | 如果表达A等于表达B,结果TRUE ,否则FALSE。 |
A != B | 所有基本类型 | 如果A不等于表达式B表达返回TRUE ,否则FALSE。 |
A < B | 所有基本类型 | 如果表达式A小于表达式B为TRUE,否则FALSE。 |
A <= B | 所有基本类型 | 如果表达式A小于或等于表达式B为TRUE,否则FALSE |
A > B | 所有基本类型 | 如果表达式A大于表达式B为TRUE,否则FALSE。 |
A >= B | 所有基本类型 | 如果表达式A大于或等于表达式B为TRUE,否则FALSE。 |
A [NOT] BETWEEN B AND C | 基本数据类型 | 如果A,B或者C任一为NULL,则结果为NULL。如果A的值大于等于B而且小于或等于C,则结果为TRUE,反之为FALSE。如果使用NOT关键字则可达到相反的效果。 |
A IS [NOT] NULL | 所有类型 | 如果A等于NULL,则返回TRUE,反之返回FALSE, NOT 正好相反。 |
A IN(数值1, 数值2) | 所有类型 | 如果A存在指定的数据中,则返回TRUE,反之返回FALSE。 |
A [NOT] LIKE B | 字符串 | 如果A与B匹配的话,则返回TRUE;反之返回FALSE。%代表任意多个字符,_代表一个字符 % _。 |
A RLIKE B | 字符串 | 如果A或B为NULL;如果A任何子字符串匹配Java正则表达式B;否则FALSE。 |
A REGEXP B | 字符串 | 等同于RLIKE。 |
1.2 算术运算符
运算符 | 操作 | 描述 |
---|---|---|
A + B | 所有数字类型 | A加B的结果 |
A - B | 所有数字类型 | A减去B的结果 |
A / B | 所有数字类型 | A除以B的结果 |
A % B | 所有数字类型 | A除以B.产生的余数 |
1.3 逻辑运算符
运算符 | 操作 | 描述 |
---|---|---|
A AND B | boolean | 如果A和B都是TRUE,否则FALSE。 |
A && B | boolean | 类似于 A AND B. |
A OR B | boolean | TRUE,如果A或B或两者都是TRUE,否则FALSE。 |
A || B | boolean | 类似于 A OR B. |
NOT A | boolean | TRUE,如果A是FALSE,否则FALSE。 |
!A | boolean | 类似于 NOT A. |
1.4 复杂的运算符
运算符 | 操作 | 描述 |
---|---|---|
A[n] | A是一个数组,n是一个int | 它返回数组A的第n个元素,第一个元素的索引0。 |
M[key] | M 是一个 Map<K, V> key 的类型为K | 它返回对应于映射中关键字的值。 |
S.x | S 是一个结构 | 它返回S的s字段 |
2 内置函数
2.1 数学函数
返回类型 | 签名 | 描述 |
---|---|---|
BIGINT DOUBLE | round(double a) round(double a, int d) | 返回double类型的整数值部分 (遵循四舍五入) 返回指定精度d的double类型 |
BIGINT | floor(double a) | 返回等于或者小于该double变量的最大的整数 |
BIGINT | ceil(double a) | 返回等于或者大于该double变量的最小的整数 |
DOUBLE | rand() rand(int seed) | 返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列. |
DOUBLE | pow(double a, double p) | 返回a的p次幂 |
DOUBLE | sqrt(double a) | 返回a的平方根 |
DOUBLE INT | abs(double a) abs(int a) | 返回数值a的绝对值 |
2.2 日期函数
返回类型 | 签名 | 描述 |
---|---|---|
STRING | from_unixtime(bigint unixtime[, string format]) | 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数) 到当前时区的时间格式 |
BIGINT | unix_timestamp() unix_timestamp(string date) unix_timestamp(string date, string pattern) | 获得当前时区的UNIX时间戳 转换格式为"yyyy-MM-dd HH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0 |
STRING | to_date(string timestamp) | 返回日期时间字段中的日期部分 |
INT | year(string date) month (string date) day (string date) | 分别返回日期中的年 月 天 |
INT | hour (string date) minute (string date) second (string date) | 分别返回日期中的时 分 秒 |
INT | weekofyear (string date) | 返回日期在当年的第几周 |
INT | datediff(string enddate, string startdate) | 返回结束日期减去开始日期的天数 日期有格式要求 yyyy-mm-dd hh:MM:ss 或 yyyy-mm-dd |
STRING | date_add(string startdate, int days) | 返回开始日期startdate增加days天后的日期 add_months(string startdate, int months) |
STRING | date_sub (string startdate, int days) | 返回开始日期startdate减少days天后的日期 |
2.3 条件判断函数
返回类型 | 签名 | 描述 |
---|---|---|
T | if(boolean testCondition, T valueTrue, T valueFalseOrNull) | 当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull |
T | coalesce(T v1, T v2, …) | 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL |
T | CASE a WHEN b THEN c [WHEN d THEN e] [ELSE f] END | 如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f |
T | CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END | 如果a为TRUE,则返回b;如果c为TRUE,则返回 d;否则返回e |
2.4 字符串函数
返回类型 | 签名 | 描述 |
---|---|---|
INT | length(string A) | 返回字符串A的长度 |
STRING | reverse(string A) | 返回字符串A的反转结果 |
STRING | concat(string A, string B…) | 返回输入字符串连接后的结果,支持任意个输入字符串 |
STRING | concat_ws(string SEP, string A, string B…) | 返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符 |
STRING | substr(string A, int start),substring(string A, int start) substr(string A, int start, int len),substring(string A, int start, int len) | 返回字符串A从start位置到结尾的字符串 返回字符串A从start位置开始,长度为len的字符串 |
STRING | upper(string A) ucase(string A) | 返回字符串A的大写格式 |
STRING | lower(string A) lcase(string A) | 返回字符串A的小写格式 |
STRING | trim(string A) ltrim(string A) rtrim(string A) | 去除字符串两边的空格 除字符串左边的空格 去除字符串右边的空格 |
STRING | regexp_replace(string A, string B, st 以上是关于Hive必须了解的技能有哪些?万字博客带你掌握Hive❤️还收藏干嘛,愣着啊!的主要内容,如果未能解决你的问题,请参考以下文章 一文带你了解Hive详细介绍Hive与传统数据库有什么区别? 高级JAVA开发必须掌握技能java8 新日期时间API(JSR-310:常用的日期时间API),4万字详解(全程干货,建议收藏) 高级JAVA开发必须掌握技能java8 新日期时间API(JSR-310:ZoneId 时区和偏移量),2万字详解(全程干货,建议收藏) |