【HIVESql 语法详解】—— 包罗DDL、DML、DQL语言(恰当收藏) ...

打印 上一主题 下一主题

主题 854|帖子 854|积分 2562

各人好,我是摇光~,用大白话讲解所有你难懂的知识点
我之前在学习 hadoop 和 hive 的关系后,就想整理一些hive 的知识点,以是这篇照旧大白话来了解到 hivesql 。
本篇文章重要写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、创建数据库

  1. CREATE DATABASE IF NOT EXISTS mydatabase;                        -- mydatabase 是数据库的名字       
  2. create database mydatabase location '/myhive2';                -- 创建数据库并指定hdfs存储位置
复制代码
2、删除数据库

  1. DROP DATABASE IF EXISTS mydatabase;                                # 注意:mydatabase必须为空才能删除。
  2. DROP DATABASE IF EXISTS mydatabase CASCADE;                # 如果数据库有表,就需要使用 CASCADE。(谨慎使用!)
复制代码
3、修改数据库

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

  1. use database_name;                                        -- database_name 是数据库的名字
  2. desc  database  mydatabase;                        -- 查看数据库基本信息
  3. desc database extended  mydatabase;        -- 查看数据库更多详细信息
复制代码
2、HiveSQL——表DDL

1、 创建平凡表(非常重要)



  • 基本语法:
  1. CREATE [EXTERNAL] TABLE [IF NOT EXISTS][db_name.]table_name
  2. [(col_name data_type [COMMENT col_conmment],....)]
  3. [COMMENT table_comment]
  4. [ROW FORMAT DELIMITED]
复制代码
上面的建表语句我们一句一句解析:
  1. CREATE TABLE [IF NOT EXISTS][db_name.]table_name
  2. # CREATE TABLE table_name 是必须要写的,table_name 是指表名字,尽量英文
  3. # [EXTERNAL] 是指创建外部表,如果不写就是内部表。
  4. # [db_name.] 是指数据库的名字,如果不写,就创建到默认数据库
  5. # [IF NOT EXISTS] 是指如果不存在该表名的话,就创建
复制代码
  留意:内部表和外部表的区别:
内部表数据由Hive自身管理,外部表数据则由HDFS管理;
  

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


  • 举个例子
好比数据文件长如许,每行数据字段用 “,” 分割,每行数据用换行符(‘\n’)分隔

上图的数据就可以使用下面的建表语句。
  1. CREATE TABLE IF NOT EXISTS cus_info (                # 创建表
  2.   id INT COMMENT '表ID',                                        # 表字段和字段描述
  3.   name STRING COMMENT '姓名',
  4.   age INT
  5. )
  6. COMMENT '个人信息表'                        # 表的名字
  7. ROW FORMAT DELIMITED
  8. FIELDS TERMINATED BY ','        # 字段数据之间采用 , 分隔
  9. LINES TERMINATED BY '\n';        # 行之间采用 换行符 \n 进行分隔
复制代码
留意:上述的文件数据的次序和表的字段次序必须划一。
   

  • 如许就完成了建表语句,要想查询到数据,可以直接将文件放在这个表文件夹(/user/hive/warehouse)下,就可以直接查询数据了。
  • 另有可以使用 hive 自带的加载数据逻辑举行数据加载。(第二章会讲到)
  1. -- 举例:
  2. create  table if not exists cus_info(id int ,name string)
  3. row format delimited
  4. fields terminated by '\t'
  5. stored as textfile                                 -- stored as 指存储格式
  6. location '/user/stu';                        -- location 指存储位置
复制代码


  • 其他创建表方式
  1. create table new_table as select * from cus_info;        -- select * from cus_info 是查询出来的数据,然后将查询出来的创建到一个表中
  2. create table stu4 like stu2;                                                -- 根据已有表结构创建表
复制代码
2、删除表

  1. DROP TABLE IF EXISTS mytable;        -- 删除表
  2. truncate table mytable;                        -- 清空内部表;若清空外部表,会产生错误
复制代码
3、修改表

  1. ALTER TABLE mytable ADD COLUMNS (new_column INT,new_column2 string);                # 新增表字段
  2. ALTER TABLE mytable RENAME TO new_table_name;                        # 将表名字修改
复制代码
4、查看表信息

  1. show tables;                                -- 查看当前数据库下的所有表
  2. desc cus_info;                                -- 只查询表内字段及属性
  3. desc formatted  cus_info;        -- 详细查询       
  4. show tables in default;                -- 查看 default 数据库下的所有表
  5. desc formatted cus_info;         -- 查看 cus_info 这张表的元数据信息
  6. show create table cus_info;        -- 查看表创建语句
复制代码
这里插入一个小知识,如果在查看元数据信息的时间,出现中文表明乱码,是因为存放元数据信息的 mysql 不支持中文编码,我们必要改一些配置。
  1. # 注意:以下sql 在mysql 中执行(可以后台连接mysql执行下面语句),修改Hive存储的元数据信息
  2. show databases;
  3. use hive;                        # 注意要切换到hive使用的数据库
  4. alter table hive3.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
  5. alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
  6. alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
  7. alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
  8. alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
  9. # 运行之后,之前的那些注释乱码的数据不会改过来,需要重新删除再创建表才行。
复制代码
5、分区表

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

  • ‌存储更多数据‌:与单个磁盘或文件体系分区相比,分区表可以存储更多的数据。
  • 进步查询吞吐量‌:通过跨多个磁盘分散数据查询,得到更大的查询吞吐量。
  • 并行处理‌:涉及聚合函数的查询可以更轻易地举行并行处理,提拔查询服从。
  • 提拔查询服从‌:某些查询可以优化,只需从某个或几个分区中获取数据。
  • 便于管理‌:轻易根据分区删除失去掩护意义的汗青数据。
    我们来举个例子:
  

  • 一个商场的销售信息,每天会产生许多数据,以是我们可以按天举行分区。如许可以存储更多的信息,然后还可以在查询计算的时间,举行分区计算再合并,如许查询和计算的时间就会更快。
  • 以是许多大表(数据量比较大)恰当使用分区表。
  分区表在查询、函数计算其实和平凡表没什么大的差别,重要在于数据插入和删除,必要带入分区信息。
  1. -- 创建销售分区表
  2. create table sale(product string, amount int) partitioned by (month string);       
  3. -- 创建多个分区信息
  4. create table sale(product string, amount int) partitioned by (year string,month string);               
  5. show  partitions  sale;                                                                -- 查看分区
  6. alter table sale drop partition(month = '202401');        -- 删除分区       
  7. alter table sale add partition(month='202401');                -- 添加单个分区
  8. 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语法:
  1. LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
复制代码
  这里的 LOCAL 参数值得留意下:
  

  • 如果加上 local ,就是指 从 本地文件体系(Hiveserver2服务所在及其的本地Linux文件体系) 复制文件
  • 如果不加 local,体现从 hdfs 文件体系 移动 文件
  这里一定要理解 local 的含义,加local是Hiveserver2服务所在的文件体系,不加就是hdfs;然后还要区别是复制照旧移动。
其实上面的操作本质就是:将数据文件移动或复制到hive表对应的位置
1、加载平凡表



  • 例子
  1. # 1、使用load data local,将数据文件复制到hive表对应位置,这里的local 是指Hiveserver2服务所在的本地
  2. # 追加表数据
  3. load data local inpath '/root/localdatas/cus_info.txt' into table mydatabase.local_cus_info;                       
  4. # 覆盖表数据
  5. load data local inpath '/root/localdatas/cus_info.txt' overwrite  into table mydatabase.local_cus_info;               
复制代码
  1. # 2、使用load data ,将数据文件移动到 hive 表对应位置,注意是使用hdfs文件系统
  2. # 追加表数据
  3. load data inpath '/mydatas/cus_info.txt' into table mydatabase.hdfs_cus_info;
  4. # 覆盖表数据
  5. load data inpath '/mydatas/cus_info.txt' overwrite  into table mydatabase.local_cus_info;       
复制代码
2、加载分区表数据

  1. -- 加载数据到分区表
  2. load data local inpath '/export/hivedatas/sale.csv' into table sale partition (month='201806');               
  3. -- 加载多个分区信息到表中
  4. load data local inpath '/export/hivedatas/sale.csv' into table sale  partition(year='2018',month='06');
复制代码
② Hive SQL Insert 加载数据(非常慢)

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


  • 语法
  1. insert into table cus_info values(1,'张思',23);
复制代码
上面这种插入的方法,非常的慢,因为hive的机制是先转成 MR 计算,再举行操作。(可以在YARN上查看进程)以是导致这种方法非常慢。
固然非常慢,但是insert 搭配 select 可以将查询出来的数据插入到表中。


  • 语法
  1. insert into table cust_info select id,name,age from cust_info_old;
复制代码
这种方法固然可以将查询出来的数据插入表中,但是必要留意的是字段必须相对应。


  • 语法
  1. # 查询方式加载分区数据
  2. insert overwrite table sale partition(month = '201806') select product,amount from sale1;               
复制代码
2、导出数据

  1. -- 将查询的结果导出到本地
  2. insert overwrite local directory '/export/exporthive' select * from sale;
  3. -- 将查询的结果格式化导出到本地
  4. insert overwrite local directory '/export/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from sale;
  5. -- 将查询的结果导出到HDFS上(没有local)
  6. insert overwrite directory '/export/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from sale;
复制代码
由于hive是基于数据堆栈建立,以是不支持传统意义的updata和delete,以是我们在这就不学习了。
三、DQL 数据查询语言

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


  • select语法树
  1. SELECT [ALL | DISTINCT] select_expr, select_expr, ...                         # 这里写字段名
  2. FROM table_reference                                                                                        # 表名
  3. [WHERE where_condition]                                                                                 # 筛选
  4. [GROUP BY col_list [HAVING condition]]                                                         # 分类
  5. [CLUSTER BY col_list
  6.   | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]                 # 排序
  7. ]
  8. [LIMIT number]                                                                                                        # 限制
复制代码
1、查询列名



  • 查询表
  1. select * from cus_info;                        # 查询表所有字段
  2. select id,name from cus_info;        # 查询字段 id,name 数据
  3. select 1 from cus_info;                        # 查询常量,和表字段无关
  4. select current_database();                # 查询当前数据库 - 函数运用
  5. select all name from cus_info;        # 展示这行所有信息,重复的也展示;相当于 select name from cus_info
  6. select distinct name from cus_info;                        # 去除重复数据
  7. select distinct id,name from cus_info;                # 去除两列 id,name  重复数据
复制代码
2、where 条件使用

where 起到一个过滤的作用,where反面是一个布尔表达式,效果要么为true,要么为false;当为true时,就返回select 反面的表达式内容,否则为空。
where 表达式中,可以使用Hive支持的任何函数和运算符(>、<、=、and 、or等等),但聚合函数除外。


  • 1、where 平凡表达式
  1. select * from cus_info where 1>2;                 # 所有都不满足 1>2 ,所以返回是空表
  2. select * from cus_info where 1=1;                # 所有都满足 1=1,返回全表。
复制代码


  • 2、where反面跟比较运算
  1. # 比较运算符:> , < , >= , <= , = , !=,<>
  2. select * from cus_info where name = '张三';                # 查询name叫 张三的数据。
  3. select * from cus_info where age > 20;                        # 查询 age 超过 20的人
复制代码


  • 3、where反面跟比较、逻辑运算符
  1. # 比较运算符:> , < , >= , <= , = , !=,<>
  2. # 逻辑运算符:and or
  3. select * from cus_info where name = '张三' and age = 10;                # 查询name叫 张三且age = 10 的数据。
复制代码


  • 4、where反面跟特殊条件
  1. # 1、空值判断 is null
  2. select * from cus_info where name is null;        # 查询name为空的数据。
  3. # 2、between and:两者之间的数据
  4. select * from cus_info where age between 10 and 20;         # 查询age在 10 到 20 之间的数据。
  5. # 3、in 含有这些值的数据
  6. select * from cus_info where name in ('张三','李四');         # 查询in括号里面的数据。
  7. # 4、字符串like
  8. select * from cus_info where name like '%三';                         # 查询in括号里面的数据。
复制代码
3、聚合函数



  • 语法
  1. select function(列) from table_name;         # 这里的 function 就是聚合函数
复制代码
聚合函数的特点:不管原始数据有多少行记载,经聚合操作只返回一条数据,这条数据就是聚合的效果。
   聚合函数:
  

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

  • 举例
  1. select count(*) from  cus_info;                # 返回 cus_info 的行数
  2. select max(age)        from cus_info;                # 返回 age 年龄最大的数据
复制代码
4、Group by 分组 和 hiving 子句

group by 总是和 聚合函数 一起使用,将数据分组再统计。
以下是数据:

我们通过实例来展示 group by 的用法
  1. # 对 sex 进行分类统计对score求和
  2. select sex,sum(score) from cus_info group by sex;
  3. # 对 sex 进行分类统计:count统计行数,对score求和
  4. select sex,count(sscore),sum(score) from cus_info group by sex;
  5. # 对 sex,grade 进行分类统计:count统计行数,对score求和
  6. select sex,grade,count(sscore),sum(score) from cus_info group by sex,grade;
复制代码
因为 where 内里没办法举行聚合函数,以是可以使用having 对聚合数据举行筛选。
实验的次序是:
先 where 过滤,再 group by 分组,再举行 having 对分组后数据过滤。
  1. # 1、先进行where过滤 sex = 'M' 数据
  2. # 2、再用 grade 进行分组,sum(score)
  3. # 3、最后having后面接对聚合函数结果的筛选,sum(score) > 200
  4. select grade,sum(score) from cus_info where sex = 'M' group by grade having sum(score) > 200;
  5. # 可以重命名 AS s ,再进行 s > 200
  6. 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
  1. select * from cus_info order by score ;                        # 默认升序
  2. select * from cus_info order by score DESC;                # score 字段降序排序
  3. select * from cus_info order by sex,score DESC;        # 先进行sex,再进行score 字段降序排序
复制代码


  • 2、sort by 局部排序
   sort by :用于在每个Reducer的输出分区内举行局部排序‌。它会在数据进入Reducer之前完成排序,确保每个Reducer的输出是有序的,但不会保证全局有序。
  1. set mapreduce.job.reduces=3;                                -- 设置reduce个数
  2. set mapreduce.job.reduces;                                        -- 查看设置reduce个数
  3. select * from sale sort by amount;                        -- 查询产品按照产品数量降序排列
  4. -- 将查询结果导入到文件中(按照成绩降序排列)
  5. insert overwrite local directory '/export/hivedatas/sort' select * from sale sort by amount;                 
复制代码


  • 3、分区排序
distribute by:雷同MR中partition,举行分区,联合sort by使用
  1. set mapreduce.job.reduces=7;                        # 设置reduce的个数,将我们对应的s_id划分到对应的reduce当中去
  2. select * from sale distribute by product sort by amount;                # 通过distribute by  进行数据的分区
复制代码
7、limit

limit 用于限定select语句返回的行数。
  1. select * from cus_info limit 10;        # 返回 前十行数据
  2. 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编写服从。
  1. show functions;                                                # 查看当前的hive 中有哪些函数
  2. describe function extended sum;                # 描述 sum 函数的具体用法
复制代码
1、内置函数

(1)、数学函数

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



  • 获取日期数据
  1. select current_date();                                # 查看当前日期
  2. select unix_timestamp();                        # 查看当前时间戳
  3. select year('2021-03-28 10:03:01') from tableName;                        # 获取年
  4. select month('2020-12-28 12:03:01') from tableName;                        # 获取月
  5. select day('2020-12-08 10:03:01') from tableName;                        # 获取天
  6. select hour('2020-12-08 10:03:01') from tableName;                        # 获取小时
  7. select minute('2020-12-08 10:03:01') from tableName;                # 获取分钟
  8. select second('2020-12-08 10:03:01') from tableName;                # 获取秒
  9. select weekofyear('2020-12-08 10:03:01') from tableName;        # 获取周
复制代码


  • 转换日期格式
  1. select unix_timestamp('2024-11-30 12:34:12')                                                # 将日期转换成 时间戳
  2. select unix_timestamp('2021130 12:34:23','yyyyMMdd HH:mm:ss')                # 指定格式日期赚UNIX时间戳函数
  3. select from_unixtime(12341223);                                                                                # UNIX时间戳转成日期函数
  4. select from_unixtime(1231,'yyyy-MM-dd HH:mm:ss');                                        # UNIX时间戳转成日期函数
复制代码


  • 加减日期
  1. select datediff('2024-12-23','2022-11-11');                                                        # 求两个日期之间的天数
  2. select date_add('2022-2-3',20);                                                                                # 将日期加 20 天
  3. select date_sub('2023-5-12',50);                                                                        # 将日期减 50 天
复制代码
(3)、字符串类型函数



  • 正常字符串函数
  1. select length("hello");                                # 5                                求 'hello' 字符的长度               
  2. select reverse("hello");                        # olleh                        将数据进行翻转
  3. select concat('hello','world');                # helloworld        将数据合并       
  4. select concat_ws('_','hello',array('world','!'));        # hello_world_!                第一个参数是分隔符,进行数据合并
  5. select upper('abSEd') from tableName;                # 转大写
  6. select ucase('abSEd') from tableName;                # 转大写
  7. select lower('abSEd') from tableName;                # 转小写
  8. select lcase('abSEd') from tableName;                # 转小写
  9. select trim(' abc ') from tableName;                # 两边去空格
  10. select ltrim(' abc ') from tableName;                # 左边去空格
  11. select rtrim(' abc ') from tableName;                # 右边去空格
  12. select substr('hello',2,3);                                        # ell                         从第2位开始,截取3位数据
  13. select substr('hello',-2);                                        # hell                        从倒数第二位开始截取数据
  14. select split('hello_world','_');                        # ["hello","world"]                按指定字符分割,返回一个数组
  15. select split('hello_world','_')[0];                        # hello                        通过数组下标取得数据,索引从 0 开始
  16. select replace('atguigu', 'a', 'A')                        # 字符串替换
  17. select regexp_replace('100-200', '(\\d+)', 'num')                 # 正则替换
  18. select repeat('123', 3);                                                                # 123123123                重复字符串
复制代码


  • 补足函数
  1. -- 左补足
  2. select lpad('abc',10,'EW') from tableName;                # 返回 EWEWEWEabc        使用 EW 补足 abc 左边缺失的,最终字符长度为10
  3. -- 右补足
  4. select rpad('abc',10,'EW') from tableName;                # 返回 abcEWEWEWE       
复制代码


  • URL解析函数:parse_url
  1. -- 语法: parse_url(string urlString, string partToExtract [, string keyToExtract])
  2. -- 说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.
  3. -- 返回 HOST 信息   www.tableName.com
  4. select parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST')
  5. from tableName;                       
  6. -- 返回 QUERY 信息  v1
  7. select parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1')
  8. from tableName;
复制代码


  • json解析函数:get_json_object
  1. -- 语法: get_json_object(string json_string, string path)
  2. -- 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
  3. 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集合
  1. # 创建map集合,map (key1, value1, key2, value2, …)
  2. Create table mapTable as select map('A',10,'B',20) as t from tableName;
  3. select map_keys(map('A',10,'B',20));                # ["A","B"]  返回map中的 key
  4. select map_values(map('A',10,'B',20));                # [10,20]    返回map中的 values
  5. # 访问数据
  6. select t['A'],t['B'] from mapTable;
复制代码


  • array集合
  1. # ["1","2","3"]  创建 array 集合
  2. create table arr_table2 as select array("1","2","3") as t from tableName;               
  3. select t[0],t[1] from arr_table2;                                # 访问数据
  4. select array_contains(t,'2') from arr_table2;        # 判断集合 ["1","2","3"] 是否有 "2"
  5. select sort_array(t) from arr_table2;                        # [1,2,3]  将集合中元素进行排序
复制代码


  • 布局体
  1. # 创建结构体
  2. create table struct_table as select struct('name','age','sex') as t from tableName;
  3. select t.col1,t.col3 from struct_table ;                # 访问数据
  4. create table struct_table as select struct('name','Amy','age',23,'sex','F') as t from tableName;
  5. select t.name,t.age from struct_table ;                # 访问数据
复制代码
(5)、条件函数

  1. select if(1=2,'True','False');                # 1=2 是条件,如果条件成立返回第一个值,不成立返回第二个值
  2. select if(sex='M','男','女') from cus_info  ;
  3. select
  4.         case when grade < 60 then '不及格'
  5.                  when grade < 80 then '良好'
  6.                  when grade > 80 then '优秀'
  7.                  else '其他'
  8.         end as '等级'
  9. from cus_info                                        # 对 grade 多级判断
复制代码
(6)、类型转换函数

  1. SELECT CAST(column_name AS INT) FROM table_name;
  2. #        CAST(... AS BOOLEAN): 转换为布尔类型。
  3. #        CAST(... AS TINYINT): 转换为字节类型。
  4. #        CAST(... AS SMALLINT): 转换为短整型。
  5. #        CAST(... AS INT): 转换为整型。
  6. #        CAST(... AS BIGINT): 转换为长整型。
  7. #        CAST(... AS FLOAT): 转换为浮点型。
  8. #        CAST(... AS DOUBLE): 转换为双精度浮点型。
  9. #        CAST(... AS STRING): 转换为字符串类型。
  10. #        CAST(... AS BINARY): 转换为二进制类型。
  11. #        CAST(... AS TIMESTAMP): 转换为时间戳类型。
  12. #        CAST(... AS DATE): 转换为日期类型。
  13. #        CAST(... AS DECIMAL): 转换为十进制类型。
  14. #        CAST(... AS VARCHAR): 转换为可变长度的字符串类型。
  15. #        CAST(... AS CHAR): 转换为定长字符串类型。
复制代码
(7)、数据脱敏函数

  1. # 使用正则表达式进行数据脱敏
  2. SELECT regexp_replace('1234567890', '\\d{5}(\\d{2})', '****') FROM dual;
复制代码
(8)、聚合函数



  • 语法
  1. 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 的一些知识,如果有什么不对的地方,欢迎各人指正。
还想了解什么大数据知识,可以私信我大概评论区告诉我~
我会竭尽全力用大白话讲解你们难懂的知识。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表