0
点赞
收藏
分享

微信扫一扫

HIVE知识点

三维控件研究 2022-01-11 阅读 70

1.数据处理的方法论
了解产品/运营的需求(解决目前存在的问题,得到一些具体量化的价值)->数据收集(准备数据)直观该数据是否有落库操作 -> 数据处理(数据调研阶段),数据类型转换?->数据分析 -> 数据决策和业务优化。
2.Hive是Hadoop大数据仓库Hive,主要应用在数据仓库领域
3.hive元数据存储在mysql,为什么没有使用derby?(该数据库不支持并发操作,就是单线程操作,整体效率性能偏低)
4.安装hive注意事项:
1.将mysql-connector-java-5.1.49-bin.jar 拷贝到/usr/local/src/apache-hive-1.2.2-bin/lib
2.安装mysql
5.行转列函数explode
6.hive:udf,udaf,udtf
udf:直接应用于select语句中,常见对字段的格式化处理 比如大小写转换
特点:一对一
udaf:多对一的关系,常见group by
udtf:一对多的关系。
读时模式:只有hive读取的时候才会检查schema(数据结构的表达),字段的解析
优点:load data 非常迅速,因为在写的过程中不用解析数据。
写时模式:优点:读取数据得到优化;缺点:写得慢,涉及到建立索引,进行压缩,字段检查等等
6.hive数据类型:
数值类型:可以根据本身特点,采取合适得存储类型,比如0,1 枚举值 可以采用tinyint;涉及到订单号,uuid,可以使用bigint, integer;涉及到小数可以使用 double,float;涉及到金钱,实际收入等等和钱相关得,使用decimal。
时间类型:timestamp,date
字符串类型:string
复杂类型:maps,structs等常见于流量埋点中涉及到
其他类型:boolean
7.hive中建表:
hive一般不建议delete 和update,以读入查询为主

create table 数据库.表名(
id int,
name string,
sex string)
row format delimited fields terminated by  ',' # 字段的分割
lines terminated by '\n' # 观测数据的分割

导入数据
load data local inpath '本地路径' overwrite into table 表名

8.去除脏数据
方式一:直接在源数据的时候进行处理:sed ‘1d’ source.csv > target.csv 1d指的是第一行
方式二:对数据库的表进行处理:

insert overwrite table 表名 select * from 表名 where order_id != 'order_id';

9.分组语句:

select user_id,count(distinct order_id) as order_cnt from 表名 group by user_id limit 10;

10.一个用户可以有多个订单,一个订单可以有多个商品,计算每个用户一个订单平均是多少商品

1.计算一个order中有多少个商品
select order_id, count(distinct product_id) pro_cnt from priors group by order_id limit 10000;
2.通过priors与orders表通过order_id关联,将订单中的产品信息带入到用户上
select user_id, pro_cnt from orders od inner join (select order_id, count(distinct product_id) pro_cnt from priors group by order_id limit 10000) pro on od.order_id=pro.order_id limit 10;
3.求和,一个用户总共买了多少个商品
select user_id, sum(pro_cnt) sum_prods from orders od inner join (select order_id, count(distinct product_id) pro_cnt from priors group by order_id limit 10000) pro on od.order_id=pro.order_id group by user_id limit 10;
4.求平均
select user_id, sum(pro_cnt)/count(1) sc_prod, avg(pro_cnt) from orders od inner join (select order_id, count(distinct product_id) pro_cnt from priors group by order_id limit 10000) pro on od.order_id=pro.order_id group by user_id limit 10;

11.用户一周中每一天买商品的次数 (列转行)
方式一:

select user_id
,sum(case when order_dow='0' then 1 else 0 end) dow0
,sum(case when order_dow='1' then 1 else 0 end) dow1
,sum(case when order_dow='2' then 1 else 0 end) dow2
,sum(case when order_dow='3' then 1 else 0 end) dow3
,sum(case when order_dow='4' then 1 else 0 end) dow4
,sum(case when order_dow='5' then 1 else 0 end) dow5
,sum(case when order_dow='6' then 1 else 0 end) dow6
from orders
group by user_id;

方式二:

select user_id
,sum(if(order_dow='0', 1,0)) dow0
,sum(if(order_dow='1', 1,0)) dow1
,sum(if(order_dow='2', 1,0)) dow2
,sum(if(order_dow='3', 1,0)) dow3
,sum(if(order_dow='4', 1,0)) dow4
,sum(if(order_dow='5', 1,0)) dow5
,sum(if(order_dow='6', 1,0)) dow6
from orders
group by user_id;

12 Hive的四种数据模型:内部表,外部表,分区表、分桶
13.内部表和外部表:
关键是否有external 关键字进行修饰
针对内部表,删除内部表会将元数据与数据一起删除,删除外部表,仅删除表的元数据,数据不会删除。
14.内部表和外部表的应用场景:
内部表作为中间表,因为逻辑处理完之后,这些中间表会进行删除,同样hdfs数据得到删除。
如果数据怕被误删除,可以选择外部表,因为不会删除文件,方便恢复数据。
一般通过hql语句进行数据处理,会选择内部表
15.hive建表的时候一般不建议使用关键字进行字段命名,如必要,可使用`` 进行引用
cast(字段名 as 转换的类型)
CHAR[(N)] 字符型
DATE 日期型
DATETIME 日期和时间型
DECIMAL float型
SIGNED int
TIME 时间型

select cast(date as signed) as date from  tbl_user;

结果如下:
date20181103153126
select cast(date as date) as date from  tbl_user;

结果如下:
date2018-11-03

直接建表法

create table movies(uid string, iid string, score string) row format delimited fields terminated by  '\t' # 字段的分割
lines terminated by '\n' # 观测数据的分割

应用场景:1.用户可以根据数据源的格式,进行自定义建表,包含指定字段分割符,列分割符,数据的存储格式等等。2.根据数据量,指定的时候选择合适的存储格式textfile,ORC

抽取(as)建表

查询建表语句

show create table 表名
create table movies_as as select * from movies;

应用场景:工作中常用,涉及到逻辑的整合,比如和临时表结合使用,表的结构和数据都要

like建表

create table movies_like like movies;

应用场景:只关心表的结构,数据不复制。

  1. !!!业界常使用dt, d作为分区字段命名
    union all:将AB进行数据合并,数据合并的时候要保证
    union:合并结果去重
    union all的效率比union快
    with:类似于子查询的功能,提高代码易读性,方便排查问题

17.分区表:本质:减少查询范围,提高查询效率。
常见的分区表使用 年-月-日
多级分区:存储的数据一般和流量(日志)相关
18.hive分为动态分区和静态分区
查看当前表的所有分区:

show partitions 分区表;
静态分区
insert overwrite table udata_partition partition (dt='2021-02-21') select user_id,item_id,rating from udata where user_id='196';
insert overwrite table udata_partition partition (dt='2021-02-20') select user_id,item_id,rating from udata where user_id='186';

应用场景:
缺点:每一次load data 都要操作,非常繁琐
优点:数据量不大,同时知道分区的数据类型可以这样操作
动态分区 hive> set只在当前窗口有效,退出窗口失败,除非写在配置文件中(conf/hive-site.xml)
1.打开动态分区模式

set hive.exec.dynamic.partition=true;

2.设置分区模式为非严格模式

set hive.exec.dynamic.partition.mode=nonstrict;

动态分区sql代码

insert overwrite table udata_partition partition (dt) select user_id,item_id,rating to_date(from_unixtime(cast('timestamp'/1000 as int),'yyyy-MM-dd HH:mm:ss')) from udata where user_id='196';

删除分区代码:

alter table 分区表 drop partition(dt='2022-01-09');

应用场景:
load data 非常便捷,但前提是进行动态分区的set
二者选择:工作中常用的是动态分区
18.hive桶
本质:让数据查询发生在更小的范围
hive计算桶列的hash值,再以桶的个数取模计算 某条记录属于哪个桶。
hive的应用场景:数据采样,map-side join
桶的set设置:

set hive.enforce.bucketing=true;
create table 表名(id intclustered by (id) into 4 buckets;

会自动根据bucket个数自动分配reduce task个数,reduce个数和bucket个数一样
每个reduce对应一个文件,reduce有多少个,最后生成的文件就有多少个

分区表中字段必须是表中已有的字段,
分区字段必须是表中没有的字段

tablesample是抽样语句,语法:

TABLESAMPLE(BUCKET X OUT OF Y)

x表示从第几个桶进行抽样,y表示每隔几个分桶取一个分桶,y必须是table总buckets数的倍数或者因子。hive根据y的大小决定抽样比例

select * from bucket_user tablesample(bucket 1 out of 16 on id);

如何快速知道该表的特性?

show create table table_name; #是否是分区表 维度表 数据存储路径
desc table_name; # 查看表的字段
show partitions table_name; # 分区枚举

19.跑sql出现的参数

set hive.exec.reducer.bytes.per.reducer=<number>

每一个reduce处理的byte的数量,如果大于number,就会多生成一个reduce

set hive.exec.reducers.max=<number>

控制reduce的上限

set mapreduce.job.reduces=<number>

指定reduce的个数

20.Hive 优化
*减少查询数据量(分区表,桶表优化,提前过滤,列裁剪等)
*数据压缩(文件存储优化)
*注意:数据去重推荐使用group by,少用distinct
*map端提前聚合:set hive.map.aggr=true

数据倾斜
set hive.groupby.skewindata=true;
1.随机分发不同的reduce节点,进行聚合(count)
2.最终一个reduce,做最后的聚合(1)
并行执行
set hive.exec.parallel=true

/*+ MAPJOIN(b) / b小表
/
+ STREAMTABLE(a) */ 大表
join 等价于inner join

举报

相关推荐

0 条评论