欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > HIVESql 语法详解,包含DDL、DML、DQL语言,一文了解到 hivesql(适合收藏)

HIVESql 语法详解,包含DDL、DML、DQL语言,一文了解到 hivesql(适合收藏)

2024/12/22 13:45:11 来源:https://blog.csdn.net/qq_41877371/article/details/144027886  浏览:    关键词:HIVESql 语法详解,包含DDL、DML、DQL语言,一文了解到 hivesql(适合收藏)

大家好,我是摇光~,用大白话讲解所有你难懂的知识点

我之前在学习 hadoop 和 hive 的关系后,就想整理一些hive 的知识点,所以这篇还是大白话来了解到 hivesql 。

本篇文章主要写Hive的基本操作,在进行Hive的学习前,我们来了解下hive的数据模型。
hive的数据模型
可以从上图看到,表是由一条条记录构成的,数据库由一个个表构成的,hive存储着一个个数据库。在公司里,基本一个业务条线一个数据库,这样便于数据库的管理。

数据库位置:

  • 在hive中,默认的数据库叫做:default,存储数据位置位于 HDFS 的 /user/hive/warehouse下。
  • 用户自己创建的数据库存储位置是 /user/hive/warehouse/database_name.db下。

有了上面的基础知识,我们就来了解一下 hive SQL 的语法。

一、DDL 数据定义语言

DDL是什么?
DDL是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等操作语言。

  • 对象结构:数据库(database)、表(table)、视图(view)、索引(index)等
  • DDL核心语法由 CREATE、ALTER、DROP 三个组成,DDL并不涉及表内部数据的操作

下面来学习一些 DDL 的命令:

1、HiveSQL——数据库DDL

1、创建数据库

CREATE DATABASE IF NOT EXISTS mydatabase;			-- mydatabase 是数据库的名字	
create database mydatabase location '/myhive2';		-- 创建数据库并指定hdfs存储位置

2、删除数据库

DROP DATABASE IF EXISTS mydatabase;				# 注意:mydatabase必须为空才能删除。
DROP DATABASE IF EXISTS mydatabase CASCADE;		# 如果数据库有表,就需要使用 CASCADE。(谨慎使用!)

3、修改数据库

在Hive中,数据库更像是一个命名空间,它不能被重命名,如果需要修改数据库名字,可以创建一个新的数据库,并将旧数据库表导入新的数据库,再删除旧数据库

4、查看数据库信息

use database_name;					-- database_name 是数据库的名字
desc  database  mydatabase;			-- 查看数据库基本信息
desc database extended  mydatabase;	-- 查看数据库更多详细信息

2、HiveSQL——表DDL

1、 创建普通表(非常重要)

  • 基本语法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS][db_name.]table_name
[(col_name data_type [COMMENT col_conmment],....)]
[COMMENT table_comment]
[ROW FORMAT DELIMITED]

上面的建表语句我们一句一句解析:

CREATE TABLE [IF NOT EXISTS][db_name.]table_name
# CREATE TABLE table_name 是必须要写的,table_name 是指表名字,尽量英文
# [EXTERNAL] 是指创建外部表,如果不写就是内部表。
# [db_name.] 是指数据库的名字,如果不写,就创建到默认数据库
# [IF NOT EXISTS] 是指如果不存在该表名的话,就创建

注意:内部表和外部表的区别:
内部表数据由Hive自身管理,外部表数据则由HDFS管理;

  • 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定。
  • 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
  • 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name)。
[(col_name data_type [COMMENT col_conmment],....)]
# col_name 是字段名字,比如 name,age,尽量用英文名
# data_type 是字段的数据类型,比如 int、string
# COMMENT col_conmment 是字段的注释,比如 名字,年龄,尽量使用中文解释字段意思
[COMMENT table_comment]
# table_comment 表的注释,尽量使用中文解释表的名字
[ROW FORMAT DELIMITED]
# 表示数据之间的分隔符,含有四个值,根据自己所需选择(可多选)
# FIELDS TERMINATED BY char	: 字段之间分隔符,比如 char 可以是',' 、'|'
# COLLECTION ITEMS TERMINATED BY ':' :集合元素之间分隔符,例如用 : 进行分割
# MAP KEYS TERMINATED BY '=':Map映射kv之间分隔符,映射键的分隔符,用于分隔映射中的键
# LINES TERMINATED BY '\n':行之间的分隔符 比如 :\n# FIELDS TERMINATED 默认分隔符是'\001',是一种特殊的字符,使用的是 ASCII编码,键盘打不出,编辑器打开的是 SOH
  • 举个例子

比如数据文件长这样,每行数据字段用 “,” 分割,每行数据用换行符(‘\n’)分隔
在这里插入图片描述

上图的数据就可以使用下面的建表语句。

CREATE TABLE IF NOT EXISTS cus_info (		# 创建表id INT COMMENT '表ID',					# 表字段和字段描述name STRING COMMENT '姓名',age INT
)
COMMENT '个人信息表'			# 表的名字
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','	# 字段数据之间采用 , 分隔
LINES TERMINATED BY '\n';	# 行之间采用 换行符 \n 进行分隔

注意:上述的文件数据的顺序和表的字段顺序必须一致。

  • 这样就完成了建表语句,要想查询到数据,可以直接将文件放在这个表文件夹(/user/hive/warehouse)下,就可以直接查询数据了。

  • 还有可以使用 hive 自带的加载数据逻辑进行数据加载。(第二章会讲到)

-- 举例:
create  table if not exists cus_info(id int ,name string) 
row format delimited 
fields terminated by '\t' 
stored as textfile 				-- stored as 指存储格式
location '/user/stu';			-- location 指存储位置
  • 其他创建表方式
create table new_table as select * from cus_info;	-- select * from cus_info 是查询出来的数据,然后将查询出来的创建到一个表中
create table stu4 like stu2;						-- 根据已有表结构创建表

2、删除表

DROP TABLE IF EXISTS mytable;	-- 删除表
truncate table mytable;			-- 清空内部表;若清空外部表,会产生错误

3、修改表

ALTER TABLE mytable ADD COLUMNS (new_column INT,new_column2 string);		# 新增表字段
ALTER TABLE mytable RENAME TO new_table_name;			# 将表名字修改

4、查看表信息

show tables;				-- 查看当前数据库下的所有表
desc cus_info;				-- 只查询表内字段及属性
desc formatted  cus_info;	-- 详细查询	
show tables in default;		-- 查看 default 数据库下的所有表
desc formatted cus_info; 	-- 查看 cus_info 这张表的元数据信息
show create table cus_info;	-- 查看表创建语句

这里插入一个小知识,如果在查看元数据信息的时候,出现中文注释乱码,是因为存放元数据信息的 mysql 不支持中文编码,我们需要改一些配置。

# 注意:以下sql 在mysql 中执行(可以后台连接mysql执行下面语句),修改Hive存储的元数据信息
show databases;
use hive;			# 注意要切换到hive使用的数据库alter table hive3.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8; 
alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;# 运行之后,之前的那些注释乱码的数据不会改过来,需要重新删除再创建表才行。

5、分区表

分区表:就是把一张大表按照分区信息分成许多张小表;这些小表可以存放在不同的存储位置,虽然这些表存储在不同位置,但是很多操作和普通表差不多。

分区的好处:

  • ‌存储更多数据‌:与单个磁盘或文件系统分区相比,分区表可以存储更多的数据。
  • 提高查询吞吐量‌:通过跨多个磁盘分散数据查询,获得更大的查询吞吐量。
  • 并行处理‌:涉及聚合函数的查询可以更容易地进行并行处理,提升查询效率。
  • 提升查询效率‌:某些查询可以优化,只需从某个或几个分区中获取数据。
  • 便于管理‌:容易根据分区删除失去保护意义的历史数据。

我们来举个例子:

  • 一个商场的销售信息,每天会产生很多数据,所以我们可以按天进行分区。这样可以存储更多的信息,然后还可以在查询计算的时候,进行分区计算再合并,这样查询和计算的时间就会更快。
  • 所以很多大表(数据量比较大)适合使用分区表。

分区表在查询、函数计算其实和普通表没什么大的差别,主要在于数据插入和删除,需要带入分区信息。

-- 创建销售分区表
create table sale(product string, amount int) partitioned by (month string);	-- 创建多个分区信息
create table sale(product string, amount int) partitioned by (year string,month string);		show  partitions  sale;								-- 查看分区
alter table sale drop partition(month = '202401');	-- 删除分区	
alter table sale add partition(month='202401');		-- 添加单个分区
alter table sale add partition(month='202401') partition(month = '202402');	-- 添加多个分区

二、DML 数据操纵语言

在学习完 DDL 后,我们知道怎么去创建、删除、修改 表 和数据库了,接下来我们将学习怎么插入数据、更新数据等操作。

DML是Data Manipulation Language的缩写,意思是数据操纵语言。

  • 是指在SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

由于hive它主要用来进行海量数据的提取、转化、加载,所以在Hive中的UPDATE、DELETE相关操作使用的场景比较少。

1、DML-加载数据

做数据分析肯定离不开数据,那数据是怎么加载进来的呢?

在DDL章节,我们就学到了创建表之后,只需要将数据文件放入 /user/hive/warehouse 文件夹下对应的表文件夹内,就可以查询到数据了。

但是这种简单粗暴的方法,其实不怎么推荐,毕竟不怎么规范,所以官方出了 Load 方法进行加载。接下来让我们看看怎么去加载数据。

① Hive SQL Load 加载数据(官方推荐)

  • Load语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;

这里的 LOCAL 参数值得注意下:

  • 如果加上 local ,就是指 从 本地文件系统(Hiveserver2服务所在及其的本地Linux文件系统) 复制文件
  • 如果不加 local,表示从 hdfs 文件系统 移动 文件

这里一定要理解 local 的含义,加local是Hiveserver2服务所在的文件系统,不加就是hdfs;然后还要区别是复制还是移动。

其实上面的操作本质就是:将数据文件移动或复制到hive表对应的位置

1、加载普通表
  • 例子
# 1、使用load data local,将数据文件复制到hive表对应位置,这里的local 是指Hiveserver2服务所在的本地# 追加表数据
load data local inpath '/root/localdatas/cus_info.txt' into table mydatabase.local_cus_info;			# 覆盖表数据
load data local inpath '/root/localdatas/cus_info.txt' overwrite  into table mydatabase.local_cus_info;		
# 2、使用load data ,将数据文件移动到 hive 表对应位置,注意是使用hdfs文件系统# 追加表数据
load data inpath '/mydatas/cus_info.txt' into table mydatabase.hdfs_cus_info;# 覆盖表数据
load data inpath '/mydatas/cus_info.txt' overwrite  into table mydatabase.local_cus_info;	
2、加载分区表数据
-- 加载数据到分区表
load data local inpath '/export/hivedatas/sale.csv' into table sale partition (month='201806');		-- 加载多个分区信息到表中
load data local inpath '/export/hivedatas/sale.csv' into table sale  partition(year='2018',month='06');

② Hive SQL Insert 加载数据(非常慢)

在上面我们已经学到用 Load 加载文件,进行数据插入;其实还可以通过 Insert 进行数据插入。

  • 语法
insert into table cus_info values(1,'张思',23);

上面这种插入的方法,非常的慢,因为hive的机制是先转成 MR 计算,再进行操作。(可以在YARN上查看进程)所以导致这种方法非常慢。

虽然非常慢,但是insert 搭配 select 可以将查询出来的数据插入到表中。

  • 语法
insert into table cust_info select id,name,age from cust_info_old;

这种方法虽然可以将查询出来的数据插入表中,但是需要注意的是字段必须相对应。

  • 语法
# 查询方式加载分区数据
insert overwrite table sale partition(month = '201806') select product,amount from sale1;		

2、导出数据

-- 将查询的结果导出到本地
insert overwrite local directory '/export/exporthive' select * from sale;-- 将查询的结果格式化导出到本地
insert overwrite local directory '/export/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from sale;-- 将查询的结果导出到HDFS上(没有local)
insert overwrite directory '/export/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from sale;

由于hive是基于数据仓库建设,所以不支持传统意义的updata和delete,所以我们在这就不学习了。

三、DQL 数据查询语言

上面我们学习了两种数据插入的方法,接下来我们学习重要的数据查询。

  • select语法树
SELECT [ALL | DISTINCT] select_expr, select_expr, ... 			# 这里写字段名
FROM table_reference											# 表名
[WHERE where_condition] 										# 筛选
[GROUP BY col_list [HAVING condition]] 							# 分类
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list] 		# 排序
] 
[LIMIT number]													# 限制

1、查询列名

  • 查询表
select * from cus_info;			# 查询表所有字段
select id,name from cus_info;	# 查询字段 id,name 数据
select 1 from cus_info;			# 查询常量,和表字段无关
select current_database();		# 查询当前数据库 - 函数运用select all name from cus_info;	# 展示这行所有信息,重复的也展示;相当于 select name from cus_info
select distinct name from cus_info;			# 去除重复数据
select distinct id,name from cus_info;		# 去除两列 id,name  重复数据

2、where 条件使用

where 起到一个过滤的作用,where后面是一个布尔表达式,结果要么为true,要么为false;当为true时,就返回select 后面的表达式内容,否则为空。

where 表达式中,可以使用Hive支持的任何函数和运算符(>、<、=、and 、or等等),但聚合函数除外。

  • 1、where 普通表达式
select * from cus_info where 1>2; 		# 所有都不满足 1>2 ,所以返回是空表
select * from cus_info where 1=1;		# 所有都满足 1=1,返回全表。
  • 2、where后面跟比较运算
# 比较运算符:> , < , >= , <= , = , !=,<>
select * from cus_info where name = '张三';		# 查询name叫 张三的数据。
select * from cus_info where age > 20;			# 查询 age 超过 20的人
  • 3、where后面跟比较、逻辑运算符
# 比较运算符:> , < , >= , <= , = , !=,<>
# 逻辑运算符:and or
select * from cus_info where name = '张三' and age = 10;		# 查询name叫 张三且age = 10 的数据。
  • 4、where后面跟特殊条件
# 1、空值判断 is null
select * from cus_info where name is null;	# 查询name为空的数据。# 2、between and:两者之间的数据
select * from cus_info where age between 10 and 20; 	# 查询age在 10 到 20 之间的数据。# 3、in 含有这些值的数据
select * from cus_info where name in ('张三','李四'); 	# 查询in括号里面的数据。# 4、字符串like
select * from cus_info where name like '%三'; 			# 查询in括号里面的数据。

3、聚合函数

  • 语法
select function() from table_name; 	# 这里的 function 就是聚合函数

聚合函数的特点:不管原始数据有多少行记录,经聚合操作只返回一条数据,这条数据就是聚合的结果。

聚合函数:

  • age(column):返回某列的平均值
  • count(*):返回表的行数,包含空值
  • count(column):返回某列的行数(不包含NULL值)
  • count(distinct column):返回去重后某列的行数(不包括NULL值)
  • max(column):返回某列的最高值,不包含空值
  • min(column):返回某列的最低值,不包含空值
  • sum(column):返回某列的总和,不包含空值
  • 举例
select count(*) from  cus_info;		# 返回 cus_info 的行数
select max(age)	from cus_info;		# 返回 age 年龄最大的数据

4、Group by 分组 和 hiving 子句

group by 总是和 聚合函数 一起使用,将数据分组再统计。
以下是数据:
在这里插入图片描述

我们通过实例来展示 group by 的用法

# 对 sex 进行分类统计对score求和
select sex,sum(score) from cus_info group by sex;# 对 sex 进行分类统计:count统计行数,对score求和
select sex,count(sscore),sum(score) from cus_info group by sex;# 对 sex,grade 进行分类统计:count统计行数,对score求和
select sex,grade,count(sscore),sum(score) from cus_info group by sex,grade;

因为 where 里面没办法进行聚合函数,所以可以使用having 对聚合数据进行筛选

执行的顺序是:
先 where 过滤,再 group by 分组,再进行 having 对分组后数据过滤。

# 1、先进行where过滤 sex = 'M' 数据
# 2、再用 grade 进行分组,sum(score)
# 3、最后having后面接对聚合函数结果的筛选,sum(score) > 200
select grade,sum(score) from cus_info where sex = 'M' group by grade having sum(score) > 200;# 可以重命名 AS s ,再进行 s > 200
select grade,sum(score) AS s from cus_info where sex = 'M' group by grade having s > 200;

6、排序

  • 1、order by排序

order by 可以对指定的列进行排序,默认升序(ASC),降序DESC

select * from cus_info order by score ;			# 默认升序
select * from cus_info order by score DESC;		# score 字段降序排序select * from cus_info order by sex,score DESC;	# 先进行sex,再进行score 字段降序排序
  • 2、sort by 局部排序

sort by :用于在每个Reducer的输出分区内进行局部排序‌。它会在数据进入Reducer之前完成排序,确保每个Reducer的输出是有序的,但不会保证全局有序。


set mapreduce.job.reduces=3;				-- 设置reduce个数
set mapreduce.job.reduces;					-- 查看设置reduce个数
select * from sale sort by amount;			-- 查询产品按照产品数量降序排列-- 将查询结果导入到文件中(按照成绩降序排列)
insert overwrite local directory '/export/hivedatas/sort' select * from sale sort by amount;  		
  • 3、分区排序

distribute by:类似MR中partition,进行分区,结合sort by使用

set mapreduce.job.reduces=7;			# 设置reduce的个数,将我们对应的s_id划分到对应的reduce当中去
select * from sale distribute by product sort by amount;		# 通过distribute by  进行数据的分区

7、limit

limit 用于限制select语句返回的行数。

select * from cus_info limit 10;	# 返回 前十行数据
select * from cus_info limit 6,10;	# 返回从第6行开始的 后 10 行数据

8、执行顺序

执行顺序:from > where >group by > group by 聚合函数 > having > order > select
聚合函数优先级:sum、min、max、avg、count

三、join 连接

1、inner join(join)

2、left join (left outer join)

四、hive 函数

学习了很多查询的语句,很多时候我们并不想只看数据,还想看一些统计数据;所以hive 内建了很多函数,正确的使用函数,可以提高sql编写效率。

show functions;						# 查看当前的hive 中有哪些函数
describe function extended sum;		# 描述 sum 函数的具体用法

1、内置函数

(1)、数学函数

select round(3.1415926);		# 返回整数值部分(遵循四舍五入)
select round(3.1242341,4);		# 返回指定精度的double 类型
select rand();					# 随机数函数,返回一个0-1之间的随机数
select rand(3);					# 得到一个稳定的随机数序列	select ceil(3.1) ;   			# 向上取整
select floor(4.8);  			# 向下取整select log10(100);				# 以10为底的对数函数
select pow(2,4);				# 返回2的4次幂
select exp(2);					# 自然指数
select sqrt(16);				# 16 的平方根
select bin(7);					# 7 的二进制
-- 绝对值函数: abs()、正取余函数: pmod()、正弦函数: sin()
-- 反正弦函数: asin()、余弦函数: cos()、反余弦函数: acos()
-- positive函数: positive()、negative函数: negative() 	

(2)、日期类型函数

  • 获取日期数据
select current_date();				# 查看当前日期
select unix_timestamp();			# 查看当前时间戳select year('2021-03-28 10:03:01') from tableName;			# 获取年
select month('2020-12-28 12:03:01') from tableName;			# 获取月
select day('2020-12-08 10:03:01') from tableName;			# 获取天
select hour('2020-12-08 10:03:01') from tableName;			# 获取小时
select minute('2020-12-08 10:03:01') from tableName;		# 获取分钟
select second('2020-12-08 10:03:01') from tableName;		# 获取秒
select weekofyear('2020-12-08 10:03:01') from tableName;	# 获取周
  • 转换日期格式
select unix_timestamp('2024-11-30 12:34:12')						# 将日期转换成 时间戳
select unix_timestamp('2021130 12:34:23','yyyyMMdd HH:mm:ss')		# 指定格式日期赚UNIX时间戳函数select from_unixtime(12341223);										# UNIX时间戳转成日期函数
select from_unixtime(1231,'yyyy-MM-dd HH:mm:ss');					# UNIX时间戳转成日期函数
  • 加减日期
select datediff('2024-12-23','2022-11-11');							# 求两个日期之间的天数
select date_add('2022-2-3',20);										# 将日期加 20 天
select date_sub('2023-5-12',50);									# 将日期减 50 天

(3)、字符串类型函数

  • 正常字符串函数
select length("hello");				# 5				求 'hello' 字符的长度		
select reverse("hello");			# olleh			将数据进行翻转
select concat('hello','world');		# helloworld	将数据合并	
select concat_ws('_','hello',array('world','!'));	# hello_world_!		第一个参数是分隔符,进行数据合并select upper('abSEd') from tableName;		# 转大写
select ucase('abSEd') from tableName;		# 转大写
select lower('abSEd') from tableName;		# 转小写
select lcase('abSEd') from tableName;		# 转小写select trim(' abc ') from tableName;		# 两边去空格
select ltrim(' abc ') from tableName;		# 左边去空格
select rtrim(' abc ') from tableName;		# 右边去空格select substr('hello',2,3);					# ell 			从第2位开始,截取3位数据
select substr('hello',-2);					# hell			从倒数第二位开始截取数据
select split('hello_world','_');			# ["hello","world"]		按指定字符分割,返回一个数组
select split('hello_world','_')[0];			# hello			通过数组下标取得数据,索引从 0 开始select replace('atguigu', 'a', 'A')			# 字符串替换
select regexp_replace('100-200', '(\\d+)', 'num') 		# 正则替换
select repeat('123', 3);								# 123123123		重复字符串
  • 补足函数
-- 左补足
select lpad('abc',10,'EW') from tableName;		# 返回 EWEWEWEabc	使用 EW 补足 abc 左边缺失的,最终字符长度为10-- 右补足
select rpad('abc',10,'EW') from tableName;		# 返回 abcEWEWEWE	
  • URL解析函数:parse_url
-- 语法: parse_url(string urlString, string partToExtract [, string keyToExtract])
-- 说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.-- 返回 HOST 信息   www.tableName.com
select parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') 
from tableName;			-- 返回 QUERY 信息  v1
select parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1')from tableName;
  • json解析函数:get_json_object
-- 语法: get_json_object(string json_string, string path)
-- 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
select  get_json_object('{"store1":{"fruit1":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle1":{"price":19.95,"color":"red"} },"email1":"amy@only_for_json_udf_test.net","owner":"amy"}','$.owner') from tableName;

(4)、集合函数

  • map集合
# 创建map集合,map (key1, value1, key2, value2, …)
Create table mapTable as select map('A',10,'B',20) as t from tableName;select map_keys(map('A',10,'B',20));		# ["A","B"]  返回map中的 key
select map_values(map('A',10,'B',20));		# [10,20]    返回map中的 values# 访问数据
select t['A'],t['B'] from mapTable;
  • array集合
# ["1","2","3"]  创建 array 集合
create table arr_table2 as select array("1","2","3") as t from tableName;		select t[0],t[1] from arr_table2;				# 访问数据
select array_contains(t,'2') from arr_table2;	# 判断集合 ["1","2","3"] 是否有 "2"
select sort_array(t) from arr_table2;			# [1,2,3]  将集合中元素进行排序
  • 结构体
# 创建结构体
create table struct_table as select struct('name','age','sex') as t from tableName;
select t.col1,t.col3 from struct_table ;		# 访问数据create table struct_table as select struct('name','Amy','age',23,'sex','F') as t from tableName;
select t.name,t.age from struct_table ;		# 访问数据

(5)、条件函数

select if(1=2,'True','False');		# 1=2 是条件,如果条件成立返回第一个值,不成立返回第二个值
select if(sex='M','男','女') from cus_info  ;select case when grade < 60 then '不及格'when grade < 80 then '良好'when grade > 80 then '优秀'else '其他'end as '等级'
from cus_info					# 对 grade 多级判断

(6)、类型转换函数

SELECT CAST(column_name AS INT) FROM table_name;
#	CAST(... AS BOOLEAN): 转换为布尔类型。
#	CAST(... AS TINYINT): 转换为字节类型。
#	CAST(... AS SMALLINT): 转换为短整型。
#	CAST(... AS INT): 转换为整型。
#	CAST(... AS BIGINT): 转换为长整型。
#	CAST(... AS FLOAT): 转换为浮点型。
#	CAST(... AS DOUBLE): 转换为双精度浮点型。
#	CAST(... AS STRING): 转换为字符串类型。
#	CAST(... AS BINARY): 转换为二进制类型。
#	CAST(... AS TIMESTAMP): 转换为时间戳类型。
#	CAST(... AS DATE): 转换为日期类型。
#	CAST(... AS DECIMAL): 转换为十进制类型。
#	CAST(... AS VARCHAR): 转换为可变长度的字符串类型。
#	CAST(... AS CHAR): 转换为定长字符串类型。

(7)、数据脱敏函数

# 使用正则表达式进行数据脱敏
SELECT regexp_replace('1234567890', '\\d{5}(\\d{2})', '****') FROM dual;

(8)、聚合函数

  • 语法
select function() from table_name; 	# 这里的 function 就是聚合函数

聚合函数的特点:不管原始数据有多少行记录,经聚合操作只返回一条数据,这条数据就是聚合的结果。

聚合函数:

  • age(column):返回某列的平均值
  • count(*):返回表的行数,包含空值
  • count(column):返回某列的行数(不包含NULL值)
  • count(distinct column):返回去重后某列的行数(不包括NULL值)
  • max(column):返回某列的最高值,不包含空值
  • min(column):返回某列的最低值,不包含空值
  • sum(column):返回某列的总和,不包含空值

2、用户定义函数

(1)UDF函数

  • UDF函数:普通函数,一进一出

(2)UDAF 函数

  • UDAF函数:聚合函数,多进一出

(3)UDTF 函数

对UDTF函数的讲解,我有写一篇专门的文章进行讲解:
hive UDTF Lateral view expload 详细讲解


以上就是 hivesql 的一些知识,如果有什么不对的地方,欢迎大家指正。
还想了解什么大数据知识,可以私信我或者评论区告诉我~

我会竭尽全力用大白话讲解你们难懂的知识。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com