Hive

108 篇文章 3 订阅

1-Hive--DDL操作

hql语句形式

  • DDL

    • 库、表、视图 创建修改删除

    • create、alter、drop

  • DML

    • 表的具体数据的事务操作

      • 数据写入

      • 数据的修改

      • 数据的删除

  • DQL

    • 数据查询

    • from、where、group by、having 、聚合、select、order by,limit

  • DCL

    • 权限控制

      • grant

    • 用户创建修改

重点 创建数据操作和查询数据操作

HQL建表

  • 基本建表语句

create table tb_name(
    id int comment '订单id',
    total_price int
)

hive表的字段类型

  • 原生数据类型

    • 数值型

      • int

      • float

    • 字符型

      • string

    • 日期型

      • date

    • 布尔型

      • bool

  • 复杂数据数据类型

    • array 数组 []

    • map key-value

    • struct 结构体 { int ,string array}

    • 联合体

数据类型转换

  • 隐式转换

  • 显示转换 cast()

hive文件的读写

hadoo中的文件数据和hvie的表之间的关系

读文件 -- 将文件数据映射到表上---反序列化

zhangsan,lisi,wangwu

  • 将sql语句转化为mp程序,找到对应的数据文件,按照映射表指定的格式去切割获取数据,然后将数据安装指定的字段形式进行返回

写文件--将表上的数据写入文件 -- 序列化

  • 按照指定的的格式将数据写入文件

数据格式规范指定

规范在读写数据过程中按照指定格式操作数据

  • 字段间格式

    • 张三 王五

  • 集合元素之间的

    • zhangsan,gender:boy-age:18

  • map映射

Hive使用流程

先创建表,指定数据的处理形式后才能进行相应的数据操作

  • 创建表之后,在hdfs上会表名作为目录方便后续上传数据到表中

  • 表的数据是在HDFS上存储,表的元数据实在MySQL在中存储 hive-site.xml

保存数据库名

IDNAME
1itcast
2python

保存所有表的名字

NAMEID_PK
tb_name1
tb_archer1

hive表的类型

  • 内部表

    • 一般是数据文件还没有上传仓库,需要提前创建表目录,让后将数据传入对应的表目录中

    • 默认情况下在没有指定external关键词情况下创建的都是内部表

    • 内部表管理元数据和表数据--一旦删除表之后,元数据和表数据全部清空

  • 外部表

    • 数据已经存在,对存在数仓上的数据建表后进行操作,由于存储位置不一致默认的存储位置,需要使用location指定数据存储位置路径

    • 外部表创建的关键词是external

    • 外部表只管理元数据,删除外部表不会把hdfs上的数据删除,只是把元数据删除

-- 内部表
create table student(
    id int,
    name string,
    sex string,
    age int ,
    dept string
)row format delimited
fields terminated by ',';
-- 查询
select * from student;
-- 删除
drop table student;
​
-- 外部表创建  location指定数据的位置  external创建外部表的关键
create external table student_ext(
    id int,
    name string,
    sex string,
    age int ,
    dept string
)row format delimited
fields terminated by ','
location '/stu';
​
select * from student_ext;
-- 删除
drop table student_ext;

分区表

分区可以将多个文件划分成不同文件目录,在进行查询是可以指定对应目录,直接到对应目录下完成数据的查询操做

  • partition by(分区字段,字段类型) 创建分区的关键词

  • 分区字段是虚拟字段不能和已经定义字段重复

分区表导入数据,根据导入数据方式不同,分区表可以分为静态表和动态表

  • 静态表数据导入

    • load add local inpath '路径--服务器上文件路径' into table 表名 partition(分区字段=‘名称’)

    • 静态导入需要手动的对数据进行分类导入

  • 动态表导入数据

    • inster into table 表名字 partition(分区字段) select * from tmp_table

    • hive根据指定的数据自动进行分区,生成对应的分区目录和数据

分桶表

字段层面对数据划分,划分的结果比分区表更加平均

根据字段的hash值除以指定分桶数量,然后对结果取余数,把余数相同的数据放在一起

  • CLUSTERED BY(state) sorted by (cases desc) INTO 5 BUCKETS;

-Hive--DQL

内置运算符

  • 查看函数

show functions;
desc functions extended +;
  • 关系运算符

    • 大小比较

    select 1>1;
    select 1=1;
    select 1>=1;
    • 空值判断

    select 'asd' is null;
    select 'asd' is not null;
    • 模糊查询

    select 'itcast' like 'it____'; _代表匹配一个字符
    select 'itcast' like 'it%'; _代表匹配任意个数字符
    • 正则查询

    select 'itcast' rlike 'it.';
    select 'itcast' regexp 'it.';
  • 算数运算符

    • 加减乘除

    select 1+1;
    select 1/2;
    select 1/0;
    • 取整取余

    select 3 div 2;
    select 4 % 2;
    • 位运算

    0 0000 
    1 0001
    2 0010
    3 0011
    4 0100  
    5 0101
    6 0110
    select 4 & 6; 0100 * 0110     0100
    select 4 | 6  0100 | 0110  只要有一个位数是1 该位置上的数据就是1
  • 逻辑运算符

    • 与或非

    select 1>1 and 1=1;  and 所有条件成立
    select 1>1 or 1=1;  or 一个条件成则返回true
    select  !1>1; 取反
    • 在范围内

    select 1 in (2,3);
    select 1 not in  (2,3);

内置函数

  • 字符串函数

-- 字符串长度函数
select length('asd');
-- 字符串反转函数
select reverse('asd');
-- 字符串连接函数
select concat('asd','zxc');
-- 分隔符字符串连接函数
select concat_ws('-','asd','zxc','aaa')
-- 字符串截取函数
select substr('itcast',2,2); -- 第一个截取字符的位置 第二个截取字符的个数
select substr('itcast',-2)
-- 字符串转大写函数
select upper('asd');
select lower('ASD');
-- 去空格函数
select trim(' aaa ');
select ltrim('  aaaa   ');
select rtrim('  aaaa   ');
-- 正则表达式替换函数
select regexp_replace('asd123','(\\w+)\d','aaa')
-- URL解析函数
select parse_url('http://www.baidu.com','HOST');
-- 割字符串函数
select split('asd,aaa',',')
  • 时间日期函数

-- 获取当前日期
select `current_date`();
-- 获取当前时间戳
select `current_timestamp`();
-- UNIX时间戳转日期函数
select from_unixtime(1634528834);
-- 获取当前UNIX时间戳函数
select unix_timestamp();
-- 日期转UNIX时间戳函数
select unix_timestamp('2021-10-10 10:10:10');
-- 抽取日期函数
select to_date('2021-10-10 10:10:10');
-- 日期转年函数
select year('2021-10-10 10:10:10');
-- 日期比较函数
select datediff('2021-10-10 10:10:10','2021-10-12 10:10:10');
-- 日期增加函数
select date_add('2021-10-10 10:10:10',5);
select date_sub('2021-10-10 10:10:10',5);
  • 数学函数

-- 取整函数
select round(3.1415);
-- 指定精度取整函数
select round(3.1415,2);
-- 向下取整函数
select `floor`(-1.1);
-- 向上取整函数
select ceil(1.1);
-- 进制转换函数
select conv()
-- 取随机数函数
select round(rand(3)*100);
-- 绝对值函数
select abs(-10)
  • 集合函数

-- 集合元素数
select size(`array`('a','n','b'));
-- 取map集合keys函数
select map_keys(`map`('name','python','age',19));
-- 取map集合values函数
select map_values(`map`('name','python','age',19));
-- 判断数组是否包含指定元素
select array_contains(`array`(1,2,3),4);
select 1 in (1,2,3);
-- 数组排序函数
select sort_array(`array`(1,5,3,2));
select sort_array(`array`('g','a','f','c'));
  • 条件函数

-- if条件判断
-- 空判断函数
-- 非空判断函数
-- 空值转换函数
-- 非空查找函数
select coalesce(null,null,2);
-- 条件转换函数
  • 类型转换

select cast('12' as int);
  • 数据脱敏

select mask('asd123ZXC');
select mask('asd123ZXC','*','@','#');
-- 对前n个进行脱敏替换
select mask_first_n('asd123',3);
select mask_last_n('itcastpython',3);
-- 除了前n个字符,其余进行掩码处理
select mask_show_first_n('asdzxc',2);
select mask_show_last_n('qwertyu',2);
-- 返回字符串的hash编码。xxxxxxxxxx select mask('asd123ZXC');select mask('asd123ZXC','*','@','#');--对前n个进行脱敏替换select mask_first_n('asd123',3);select mask_last_n('itcastpython',3);--除了前n个字符,其余进行掩码处理select mask_show_first_n('asdzxc',2);select mask_show_last_n('qwertyu',2);--返回字符串的hash编码。-- 脱敏--对前n个进行脱敏替换--除了前n个字符,其余进行掩码处理--返回字符串的hash编码。
  • 其他

-- 反射函数
select reflect("java.lang.Math","max",11,22);
-- 取哈希值函数
-- SHA-1加密
-- MD5加密
​

自定义函数(UDF)(了解)

  • UDF 普通函数 输入一行输出一行

  • UDAF 聚合函数 输入多行输出一行

  • UDTF 输入一行输出多行

Hive函数进阶

  • explode(UDTF)

    • NBA总冠军球队

    create table the_nba_championship(
        team_name string,
        champion_year array<string>
    ) row format delimited
    fields terminated by ','
    collection items terminated by '|';
    ​
    -- 使用explode函数对champion_year进行拆分
    ​
  • lateral View

  • 行列转换 concat

    列比较

    select count(case when gender='男' then id end) as '男',count(case when gender='女' then id end) as '女' from students
    3040

    行比较

    select gender,count(id) as count from student group by gender
    
    GENDERCOUNT
    30
    40

    • 行转列

    create table row2col2(
       col1 string,
       col2 string,
       col3 int
    )row format delimited fields terminated by '\t';
    
    • 列转行

    create table col2row2(
       col1 string,
       col2 string,
       col3 string
    )row format delimited fields terminated by '\t';
    
  • json数据处理

    • 单个字段

    create table tb_json_test1 (
      json string
    );
    
    get_json_object(json,'$.deviceType')
    
    • 多个字段

    create table tb_json_test2 (
       device string,
       deviceType string,
       signal double,
       `time` string
     )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    STORED AS TEXTFILE;
    
     json_tuple(json,'device','deviceType')
    
    • serder

    create table tb_json_test2 (
       device string,
       deviceType string,
       signal double,
       `time` string
     )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    STORED AS TEXTFILE;
    
    -- 拓展--xml数据处理
    desc function extended xpath;
    SELECT xpath('<a><b>b1</b><b>b2</b><b>b3</b><c>c1</c><c>c2</c></a>', 'a/b/text()')
    

窗口函数

聚合函数、分析函数、排序函数 over(partition by 字段1... order by 字段1... rows 范围)

  • 建表

---建表并且加载数据
create table website_pv_info(
   cookieid string,
   createtime string,   --day
   pv int
) row format delimited
fields terminated by ',';

create table website_url_info (
    cookieid string,
    createtime string,  --访问时间
    url string       --访问页面
) row format delimited
fields terminated by ','
  • 求出每个用户总pv数sum+group by普通常规聚合操作

select cookieid,sum(pv) from website_pv_info group by cookieid;
  • 求出网站总的pv数 所有用户所有访问加起来

 
  • 求出每个用户总pv数

select cookieid,sum(pv) over(partition by cookieid) from website_pv_info;
  • 求出每个用户截止到当天,累积的总pv数

-- 求出每个用户截止到当天,累积的总pv数  between unbounded preceding and current row 等价  unbounded preceding
-- order by 默认有一个计算范围 unbounded preceding
select cookieid,sum(pv) over(partition by cookieid order by createtime rows between unbounded preceding and current row ) from website_pv_info;
select cookieid,sum(pv) over(partition by cookieid order by createtime rows unbounded preceding) from website_pv_info;
select cookieid,sum(pv) over(partition by cookieid order by createtime ) from website_pv_info;
  • 自定义窗口范围

unbounded preceding
  • 找出每个用户访问pv最多的Top3重复并列的不考虑

-- 排序  rank 遇到重复会生成不连续的序号  dense_rank连续序号 row_number生成行号
select *,rank() over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;
select *,dense_rank()  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;
select *,row_number()  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;
select *,ntile(3)  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;


with tb1 as ( select *,dense_rank()  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info )
from tb1
select *
 where rank_num <= 3;
  • 统计每个用户pv数最多的前3分之1天

with tb1 as (select *,ntile(3)  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info)
from tb1
select *
 where rank_num = 1;
  • 分析函数

select *,lag(pv)  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;
-- 向下取值
select *,lead(pv)  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;
-- 取第一个值
select *,first_value(pv)  over (partition by cookieid order by pv desc ) as rank_num from website_pv_info;
-- 去最后一个值 注意取值范围 因为orderby 所用取值范围需要增加向下的范围
select *,last_value(pv)  over (partition by cookieid order by pv desc rows between unbounded preceding and unbounded following) as rank_num from website_pv_info;


select sum(pv) sum(sum(pv)) over() from website_pv_info

数据压缩

  • 压缩算法

  • map压缩

1)开启hive中间传输数据压缩功能
set hive.exec.compress.intermediate=true;
2)开启mapreduce中map输出压缩功能
set mapreduce.map.output.compress=true;
3)设置mapreduce中map输出数据的压缩方式
Set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
  • reduce压缩

1)开启hive最终输出数据压缩功能
set hive.exec.compress.output=true;
2)开启mapreduce最终输出数据压缩
set mapreduce.output.fileoutputformat.compress=true;
3)设置mapreduce最终数据输出压缩方式
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4)设置mapreduce最终数据输出压缩为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

数据存储格式

  • 行存储和列存储

  • TextFILE

  • ORC

  • PAROUET

  • 格式对比

TEXTfile

create table log_text (
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE ;

orc

create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS orc ;

PARQUET

create table log_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS PARQUET ;	

  • 查询速度对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值