语法语句:
external 外部的 创建外部表所用. 外部表被删除时数据不会被删除
小知识: hive的表分为内部表(管理表)和外部表 external(外部) 默认内部
- 内部表(管理表) :在进行删除表的时候会将数据删除,导致其他使用这个数据的表,数据丢失.
- 如果数据是共享的,数据比较重要,建议使用外部表
- 管理表不用指定location 默认有自己与表名相同的目录
- 外部表指定location 指定数据位置 也可不指定 指定后,表名与数据文件夹名不一致
- 外部表不需要自己的目录结构
export 导出 将表中数据导出到本地文件夹中
使用场景一般是数据的迁移/备份
export table ku1.t1 to '/out/';
import 导入 将本地数据导入到表中
import table k2.t2 from '/out/';
comment 注释 可以注释表,字段
explain 计划执行
将查询结果建表
create table t1 as select...
常用函数:
if()
if(字段 is null , 0 , 1)配合sum()等聚合函数使用
也可用于打标记 if(字段 == 值,'标记1','标记2' )
case when end as 别名
case column
when 值1 then ''
when 值2 then ''
...
else ''
end as 别名
case
when column = 值1 then ''
when column = 值2 then ''
...
else ''
end as 别名
max(column)
size() 返回集合的长度
array(e1,e2...) 创建数组
array_contains() 是否包含
map('k1',11,'k2',22,'k3',33) 创建map
str_to_map() 参数一 字符串 参数二 元素的分隔符 参数三 key , value的分隔符
例:str_to_map('zss:23,lss:33' , ',' , ':')
struct() 数据结构体 类似java中的Bean 数据
{"street":"hui long guan","city":"beijing"} struct<street:string , city:string>
{"street":"chao yang","city":"beijing"} 当数据都是这种形式时,使用struct结构体
concat(可变参数) 字符串拼接
collect_list(column) 将组内数据收集到数组中
collect_set() 与collect_list 的区别是去重
concat_ws('分隔符',数组) 将数组中的元素使用分隔符拼接起来
就是将数组的样式改变了一点
split(字符串,'切割符') 返回数组
explode(集合) 将一行中复杂的array或者map结构拆分成多行,炸开
配合侧窗口函数使用完成列转行
lateral view 维护了炸开前后的数据关系
SELECT
name ,
cate
FROM
tb_movie
lateral view
explode(category) tmp as cate ;
编号函数
rank() 相同的数据编号一致 最大的编号是行数
dense_rank() 相同的数据编号一致 最大的编号数可能小于行数
row_number() 编号 也用来做连续值,连续天,连续次数之类
窗口函数
over() 指定分析(聚合)函数工作的数据窗口大小,这个窗口大小可能随着巷道变化而变化
curret row 当前行
n preceding 向前n行数据
n following 向后n行数据
unbounded preceding 从第一行 起点
unbounded following 到最后一行 终点
lag(字段,intnum,default) 取前n行数据
lead(字段,intnum,default) 取后n行数据
SELECT
* ,
-- 按照名字开窗口 窗口内时间排序 计算逻辑是 起始行到当前行累加
sum(money) over(partition by name order by cdate rows between 起始行 and 当前行) -- 窗口内排序
FROM
tb_orders ;
-- unbounded preceding 起点
SELECT
* ,
-- 按照名字开窗口 窗口内时间排序 计算逻辑是 起始行到当前行累加
sum(money) over(partition by name order by cdate rows between unbounded preceding and current row) -- 窗口内排序
FROM
tb_orders ;
-- 当前行 和 上一行加
SELECT
* ,
-- 按照名字开窗口 窗口内时间排序 计算逻辑是 起始行到当前行累加
sum(money) over(partition by name order by cdate rows between 1 preceding and current row) -- 窗口内排序
FROM
tb_orders ;
SELECT
* ,
-- 按照名字开窗口 窗口内时间排序 计算逻辑是 起始行到当前行累加
sum(money) over(partition by name order by cdate rows between 1 preceding and 1 following) -- 窗口内排序
FROM
tb_orders ;
数据结构体:
array()
map()
struct()数据结构体 类似java中的Bean 数据
{"street":"hui long guan","city":"beijing"} struct<street:string , city:string>
{"street":"chao yang","city":"beijing"} 当数据都是这种形式时,使用struct结构体