hive分区
在大数据中,最常用的一种思想是分治,分区表实际就是对应hdfs文件系统上的独立的文件夹,该文件夹下是该分区所有数据文件
hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过where子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
创建分区表(静态分区)
通过PARTITIONED BY定义分区
create table dept_par(deptno int, dname string, loc string)
partitioned by(day string)
row format delimited
fields terminated by ‘\t’;
load data local inpath ‘/opt/data/dept1.txt’ into table dept_par partition(day=‘2020-10-25’);
load data local inpath ‘/opt/data/dept1.txt’ into table dept_par partition(day=‘2020-10-26’);
load data local inpath ‘/opt/data/dept1.txt’ into table dept_par partition(day=‘2020-10-27’);
指定分区查询
select * from dept_par where day=‘2020-10-25’;
页面分区展示
通过insert into插入数据
insert into cust_detail_partition
partition(name="dongxian")
select
cid,
begin_date,
trade_account_id,
cust_name,
pre_trade_id,
his_trade_id,
goods_name,
trade_type_1,
trade_type_2,
number_of_goods,
pre_trade_money,
actual_trade_money,
pre_trade_status,
end_date
from cust_detail where cust_name like "%陈祥华%";
页面展示
添加和删除分区
ALTER TABLE employee_partitioned ADD
PARTITION (year=2019,month=3) PARTITION (year=2019,month=4);
ALTER TABLE employee_partitioned DROP PARTITION (year=2019, month=4);
动态分区
set hive.exec.dynamic.partition=true; --允许动态分区
set hive.exec.dynamic.partition.mode=nonstrict; --关闭严格模式
set hive.mapred.mode=nonstrict; --关闭mapreduce的严格模式
set yarn.scheduler.minimum-allocation-mb=1024 --虚拟内存值,可以根据实际情况调整
set hive.exec.max.dynamic.partitions.pernode=20000; -- 允许的最大分区数100
insert into方式添加动态分区
insert into table employee_partitioned partition(year, month)
select name,array('Toronto') as work_place,
named_struct("sex","male","age",30) as sex_age,
map("python",90) as skills_score,
map("r&d", array('developer')) as depart_title,
year(start_date) as year,month(start_date) as month
from employee_hr eh ;
hive分桶
分桶是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀的分发到各个桶文件中
分区针对的是数据的存储路径,分桶针对的是数据文件
分区里的字段名和表的字段名不同,分桶的字段名必须是表中已有的列
分桶的个数最好是2的n次方
create table stu_buck(id int,name string)
clustered by(id)
into 4 buckets
row format delimited
fields terminated by ‘\t’;
load data local inpath ‘/opt/data/stu.txt’ into table stu_buck;
分桶的规则采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中
抽样
可以基于整行数据进行随机抽样
SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;
--抽取32份中的第3份桶的随机数据
可以基于指定列进行随机抽样(使用分桶列更高效)
SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON id) s;
--抽取32份中第3份桶的桶分列id 的数据
基于block size进行随机抽样
SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s; --抽取10%的数据进行展示
SELECT * FROM table_name TABLESAMPLE(1M) s; --抽取1M大小的文件内容进行展示
SELECT * FROM table_name TABLESAMPLE(10 rows) s; --抽取前10行数据进行展示
区别
partitioned by(分区名 分区类型)
插入分区数据时会产生(分区名=分区值)的文件夹,分区数据存储在文件夹中
用where条件来查询
clustered by(列名) into x buckets
前提条件:buckets如果和reduce数量不一致,会产生伪分桶的情况(数据会根据分桶排序,但是不会切分成多个文件)
设置强制分桶:hive.enforce.bucketing=true
设置reduce数量和bucket数量一致
set mapred.reduce.tasks=x;
分桶完成会形成多个文件, tablesample(bucket 1 out of x on 列名)
视图
视图概述
通过隐藏子查询、连接和函数来简化查询的逻辑结构
虚拟表,从真实表中选取数据
只保存定义,不存储数据
如果删除或更改基础表,则查询视图将失败
视图是只读的,不能插入或装载数据
应用场景
将特定的列提供给用户,保护数据隐私
查询语句复杂的场景
视图的操作
视图操作命令:create、show、drop、alter
创建视图
create view 视图名 as select …;
查找视图
show tables;(show views 在 hive v2.2.0之后)
show create table 视图名; - - 查看视图定义
删除视图
drop 视图名;
更改视图
alter view 视图名 set tblproperties(‘comment’ = ‘This is a view’) - -更改视图属性
alter view 视图名 as select statement; - - 更改视图定义
侧视图
常与表生成函数结合使用,将函数的输入和输出连接
OUTER关键字:即使output为空也会生成结果
split()函数是用于切分数据,也就是将一串字符串切割成了一个数组,标准格式为split(str,regex),支持正则切分
explode()函数用于打散行的函数(将一行的数据拆分成多行,它的参数必须为map或array)。这个函数常和split()并用
举例:
假设我有一张表(demo)如下:
select split(name,’,’) as name,age from demo;
select explode(split(name,’,’)) as name from demo;
select rename,age from demo lateral view explode(split(name,’,’)) demo as rename;
– 命名成rename这样这句话好理解一点,不会和原来的name列搞混
如果将name,age同时打散合并
select name,age from demo
lateral view explode(split(name,’,’)) demo as name
lateral view explode(split(age,’,’)) demo as age;