hive 参数、变量
hive当中的参数、变量,都是以命名空间开头
四种变量:
命名空间权限范围
hiveconf
 可读写 

hive-site.xml当中的各配置变量

hive --hiveconf hive.cli.print.header=true

system
 可读写

系统变量,包含JVM运行参数等

例:system:username=root

env
 只读

环境变量

例:env:JAVA_HOME

hivevar
 可读写
例如:hive -d key=val
取变量
    通过${}方式进行引用,其中system、env下的变量必须以前缀开头
设置方式
    1、修改配置文件 ${HIVE_HOME}/conf/hive-site.xml
    2、启动hive cli时,通过--hiveconf key=value的方式
例如 hive --hiveconf hive.cli.print.header=true
    3、进入cli之后,通过使用set命令设置
hive set命令
在hive cli控制台可以通过set对hive中的参数进行查询、设置
set设置值
set hive.cli.print.header=true;
set查看值
set hive.cli.print.header
set 直接回车查看所有
hive参数通过文件初始化
当前用户目录的 .hiverc 文件
如 : ~/.hiverc
如果没有,可直接创建该文件,将需要设置的参数写到该文件中,hive启动运行时,会加载改文件中的配置。
hive历史操作命令集
~/.hivehistory


hive 动态分区
让hive在插入数据自动对数据进行分区
开启动态分区
set hive.exec.dynamic.partition=true;
-- 默认false
set hive.exec.dynamic.partition.mode=nostrict
-- 默认strict(只要需要一个分区时静态分区,需要关闭)
相关参数
set hive.exec.max.dynamic.partition.pernode
-- 每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
-- 所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
-- 所有的max job允许创建的文件的最大数量(100000)

例子

create table psn21 (
 id int,
 name string
)
partitioned by (sex string,age int)
加载数据时进行分区
from psn3
insert overwrite table psn21 partition(sex, age)  
select id, name, sex, age distribute by sex, age;



 hive分桶

将表或分区的结果进一步划分
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
对于hive中每一个表、分区都可以进一步进行分桶。
由列的 哈希值除以桶的个数 来决定每条数据划分在哪个桶中。

适用场景
数据抽样( sampling )
map-join 
-- join平时需要全表扫描是否值相同,如果分桶了就已经提前按值的哈希值分到不同的桶中
-- 这是 判断是否相同就可以只到对应的桶中 进行查找,但是两个表的桶数需要相同或为倍数

开启支持分桶
set hive.enforce.bucketing=true;
默认:false;
                        设置为true之后,mr运行时会根据 bucket的个数自动分配reduce task的个数
(用户也可以通过mapred.reduce.tasks自己设置reduce的个数,但在分桶时不推荐使用)
注意:依次作业产生的 桶(文件数量)和 reduce task个数一致

创建分桶表
create table psn_bucket (
 id int,
 name string,
 age int
)
clustered by (age) into 4 buckets
row format delimited
fields terminated by ',';	
    clustered by (age) sorted by (name) into 4 buckets; 分桶并排序
往分桶表加载数据
insert into table bucket_table select columns from tbl;
insert overwrite table bucket_table select columns from tbl;


## 分桶 抽样查询
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
TABLESAMPLE 语法:
TABLESAMPLE ( BUCKET x OUT OF )
     x:表示从哪个bucket开始抽取数据
     y:必须为该表总bucket数的倍数或因子 , 由总bucket数 / y 得到总共需要抽取的bucket数
columns: 列名
当表总bucket数为 32 
TABLESAMPLE(BUCKET 2 OUT OF 16),抽取哪些数据?
    共抽取2(32/16)个bucket的数据,抽取第2、第18(16+2)个bucket的数据
TABLESAMPLE(BUCKET 3 OUT OF 256)
    抽取第3个bucket中 1/8 的数据
抽样例子
create table psn31 (
 id int,
 name string,
 age int
)
row format delimited
fields terminated by ',';
数据
1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88
创建分桶表
create table psn_bucket (
 id int,
 name string,
 age int
)
clustered by (age) into 4 buckets
row format delimited
fields terminated by ',';
加载数据
insert into table psn_bucket select id,name,age from psn31;
抽样
select id,name,age from psn_bucket tablesample(bucket 2 out of 4 on age);

添加新评论