Apache Hive DML语句与函数使用

Hive SQL 加载数据

之前我们加载数据是,创建一张表,将结构化文件放到hadoop对应表路径下。这样我们就将表和文件进行映射了。但是这样比较暴力,官方不推荐。

这样的操作是直接跳过了Hive

Load加载数据
语法:
load data [local] inpath ‘filepath’ [overwrite] into table tablename;
写了local就是指本地文件系统,不管你客户端在哪里,指的是hive服务所在的本地文件系统。
不写local就是指hdfs文件系统
在这里插入图片描述

create table test.student_local(
    num int,
    name string,
    sex string,
    age int,
    dept string
)row format delimited
fields terminated by ",";

-- 加载本地文件,是复制的动作,源文件还在!
load data local inpath '/hivedata/student.txt' into table test.student_local;

-- 加载hdfs文件,这是移动文件的动作,源文件没了!
load data inpath '/student.txt' into table test.student_hdfs;

-- overwrite 关键字会将表中原有的数据清除掉
load data inpath '/student.txt' overwrite  into table test.student_hdfs;

Insert插入数据
Hive官方推荐加载数据方式:
清洗数据成为结构化文件,再使用load语法加载数据到表中,这样效率更高
也可以使用insert语法把数据插入到指定的表中,最常用的配合是把查询返回的结果插入到另一张表中。
insert into test.student_local values (11,“张三”,“男”,18,“MA”);
使用insert插入数据,底层会走MR程序,找yarn申请资源,走map阶段,reduce阶段,中间还有繁琐的shuffle,最后输出结果。
在这里插入图片描述
在这里插入图片描述
所以我们绝对不会使用insert语法插入数据。

常用的是insert+select语句
insert into 表1 select 字段1… from 表2
这个也是会执行一个MR程序。但是执行速度会比直接插入快一些,不知道为啥,视频教程没讲。


Hive SQL 查询数据

select * from 表名-- 查询所有数据
select 字段1,字段2... from 表名 -- 查询指定字段
select current_database();  -- current_database() 函数,查看当前使用的数据库


select distinct 字段1,字段2 from 表名  -- 去重查询,多个字段整体去重

-- where条件,可以使用函数,但是不能使用聚合函数
select 字段 from where 条件1 and 条件2 or 条件3 or length(字段)>10
is null
between and
in
-- 和sql差不多

--聚合操作,就是使用聚合函数
-- 聚合函数最大的特点是,不管原始数据有多少行,经过聚合操作只返回一条数据,这一条数据就是聚合函数的结果
-- 聚合函数,例如: count(不包括null值)、sum、max、min、avg
-- 使用 as 取别名,和sql一样

group by -- 分组
-- group by 语法,只会将分组后的数据的第一行数据返回,所以,你不在group by 里面的字段,需要使用聚合函数包起来
select state from 表名 group by state  --这是可以的
select state,count(字段1) from 表名 group by state  -- 这也是可以的
select state,字段2 from 表名 group by state -- 这是不行的

-- having 是分组之后的条件过滤,可以使用聚合函数 
select * from 表名 group by 字段名 having 条件

-- order by 排序


select [distinct] 字段...
from 表名
where 条件
group by 字段
having 条件
order by 字段   -- 默认升序ASC,降序DESC,可以多个字段,先根据字段1排序,相同之后,再根据字段2排序
limit 开始行,行数  -- limit 2,3 从第二行开始,取三条数据,行数从0开始计算。  limit 3,从0开始,取3条数据

-- 再查询过程中执行顺序
-- from > where > group by(含聚合) > having  > select > order
-- 聚合函数要比having子句优先执行
-- where子句再查询过程中执行优先级别优先于聚合语句

Hive SQL Join关联查询

表连接和SQL一样
内连接 inner join
在这里插入图片描述

外连接 left join , right join
左外连接
在这里插入图片描述

使用on 连接关系,笛卡尔积消除


Hive SQL中的函数使用

使用 show functions 查看当下可用的所有函数
通过 describe function extended 函数名 来出查看函数的使用方式

函数分类:内置函数,用户定义函数UDF
内置函数可分为:数值型函数,日期类型函数,字符串类型函数,集合函数,条件函数
用户定义函数根据输入输出的行数可分为3类:UDF,UDAF,UDTF
UDF,普通函数,一进一出
UDAF:聚合函数,多进一出
UDTF:表生成函数,一进多出

常用的内置函数
官方文档: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

--------------------String Functions 字符串函数 -------------------------
select length("qwe");  -- 查看长度
select reverse("qwe"); -- 反转
select concat("qwe","asd");  -- 连接两个字符串 输出:qweasd
select concat_ws('.','www',array('qwe','asd'));  -- 参数1:分隔符,参数2:可以是字符串,参数3:可以是符合类型字符串
-- 输出结果为 www.qwe.asd
select substr('qweasd',-2); -- 字符串截取,为负数,则从后往前截取,最后一位为-1,输出为:sd
select substr('qweasd',2,2); -- 索引从1开始 输出为:we
select split('qwe asd',' '); -- 按照指定分割符进行分割,返回为数组,索引从0开始


-------------------- Date Functions 日期函数 -------------------------
-- 获取当前日期
select current_date();
-- 获取当前UNIX时间戳函数,精确到秒
select unix_timestamp();
-- 日期转时间戳
select unix_timestamp("2022-12-09 14:20:09");
-- 指定格式日期转时间戳
select unix_timestamp("20221102 13:03:12","yyyyMMdd HH:mm:ss");
-- 时间戳转日期
select from_unixtime(0,'yyyy-MM-dd HH:mm:ss')
-- 日期比较函数 日期格式要求:yyyy-MM-dd HH:mm:ss or yyyy-MM-dd
-- 返回相差天数,不用考虑闰年问题,月份问题
select datediff('2012-12-09','2012-10-09')
-- 日期增加函数 
select date_add('2012-10-20',10);
-- 日期减少函数
select date_sub('2012-02-09',10);

-------------------- 数学函数 --------------------
-- 取整函数,四舍五入,返回double类型 3
select round(3.1415926)
-- 指定精度 四舍五入,返回double类型 3.1416
select round(3.14159264)
-- 取随机数,返回0~1范围内的随机数
select rand();
-- 指定种子取随机数,每次随机数都是固定的一个数,传入的种子不一样随机数也不一样
select rand(3)

-------------------- 条件函数 -------------------- 
select * from 表名 limit 3;

--------------------  条件判断 -------------------- 
-- 为true 取第一个,为false或者null 取第二个
select if(sex='男','M','W') from 表名
-- 将case值进行 when后面的值匹配,符合就输出then后面的值,后面可以跟许多个 when 值 then 值
select case 字段 when 50 then 'tom' when 100 then 'mary' else 'tim' end from 表名 ;

-------------------- 空值转换 -------------------- 
-- 字段如果不为bull则返回本身的值,如果为空则返回后面指定的值
select nvl(字段,'test')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值