Hive2
1、hive中有哪些类型的hive参数
hive当中的参数、变量,都是以命名空间开头
命名空间 | 读写权限 | 含义 |
---|---|---|
hiveconf | 可读写 | hive-site.xml当中的各配置变量例:hive --hiveconf hive.cli.print.header=true |
system | 可读写 | 系统变量,包含JVM运行参数等例:system:user.name=root |
env | 只读 | 环境变量例:env:JAVA_HOME |
hivevar | 可读写 | 例:hive -d val=key |
通过${}方式进行引用,其中system、env下的变量必须以前缀开头
hive 参数设置方式
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
hive参数初始化配置
当前用户家目录下的.hiverc文件
如: ~/.hiverc
如果没有,可直接创建该文件,将需要设置的参数写到该文件中,hive启动运行时,会加载改文件中的配置。
hive历史操作命令集
~/.hivehistory
2、详述动态分区以及SQL
从普通表向分区表中以Insert方式插入数据时,如果需要创建的分区很多,比如以表中某个字段进行分区存储,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,可以基于查询参数的位置去推断分区的名称,从而建立分区。但是Hive的动态分区功能需要进行手动配置。
(1)创建分区表
create table tb_partitioned(id bigint, name string) partitioned by (time bigint) row format delimited fields terminated by '\t';
(2)加载数据到分区表中
load data local inpath '/root/data1' into table ori_partitioned partition(time='20111230000010') ;
3)创建目标分区表
create table ori_partitioned_target(id bigint, time bigint, uid string,keyword string, url_rank int, click_num int, click_url string) PARTITIONED BY (time STRING) row format delimited fields terminated by '\t';
(4)设置动态分区
set hive.exec.dynamic.partition = true;set hive.exec.dynamic.partition.mode = nonstrict;set hive.exec.max.dynamic.partitions = 1000;set hive.exec.max.dynamic.partitions.pernode = 100;set hive.exec.max.created.files = 100000;set hive.error.on.empty.partition = false;insert overwrite table tb_partitioned_target partition (time) select id, name, time from tb_partitioned;
3、详述分桶机制以及列出分桶SQL
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
对于hive中每一个表、分区都可以进一步进行分桶。
由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。
hive分桶的原理
跟MR中的HashPartitioner的原理一模一样
MR中:按照key的hash值去模除以reductTask的个数
Hive中:按照分桶字段的hash值去模除以分桶的个数
hive分桶的作用
好处:
1、方便抽样
2、提高join查询效率
hive分桶和分区的区别
分桶表和分区表的 桶数 和 分区数的 决定机制:
分桶表的个数:由用户的HQL语句所设置的reduceTask的个数决定
表的分区的个数:也能由用户自定义指定。也能由程序自动生成, 分区是可以动态增长的
分桶表和分区表的个数的区别:
分桶表是一经决定,就不能更改,所以如果要改变桶数,要重新插入分桶数据
分区数是可以动态增长的
log日志
一天存一个分区
分桶表和分区表中数据的表现:
1、分桶表中的每个分桶中的数据可以有多个key值
2、分区表中的每个分区只有一个 key值
分桶相关SQL
(1)配置开启分桶
set hive.enforce.bucketing=true;
(2) 创建普通表
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
(3)创建分桶表
CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
(4)向分桶表添加数据
insert into table psnbucket select id, name, age from psn31;
(5)抽样
select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
4、列出权限管理用到的SQL语句
三种授权模型:
1、Storage Based Authorization in the Metastore Server
基于存储的授权 - 可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如:列级别、行级别)。
2、SQL Standards Based Authorization in HiveServer2
基于SQL标准的Hive授权 - 完全兼容SQL的授权模型,推荐使用该模式。
3、Default Hive Authorization (Legacy Mode)
hive默认授权 - 设计目的仅仅只是为了防止用户产生误操作,而不是防止恶意用户访问未经授权的数据。
角色的添加、删除、查看、设置:
CREATE ROLE role_name; -- 创建角色
DROP ROLE role_name; -- 删除角色
SET ROLE (role_name|ALL|NONE); -- 设置角色
SHOW CURRENT ROLES; -- 查看当前具有的角色
SHOW ROLES; -- 查看所有存在的角色
权限设置
SELECT privilege – gives read access to an object.
INSERT privilege – gives ability to add data to an object (table).
UPDATE privilege – gives ability to run update queries on an object (table).
DELETE privilege – gives ability to delete data in an object (table).
ALL PRIVILEGES – gives all privileges (gets translated into all the above privileges).
将角色授予某个用户、角色:
GRANT role_name [, role_name] ...
TO principal_specification [, principal_specification] ...
[ WITH ADMIN OPTION ];
移除某个用户、角色的角色:
REVOKE [ADMIN OPTION FOR] role_name [, role_name] ...
FROM principal_specification [, principal_specification] ... ;
查看授予某个用户、角色的角色列表
SHOW ROLE GRANT (USER|ROLE) principal_name;
查看属于某种角色的用户、角色列表
SHOW PRINCIPALS role_name;
将权限授予某个用户、角色:
GRANT
priv_type [, priv_type ] ...
ON table_or_view_name
TO principal_specification [, principal_specification] ...
[WITH GRANT OPTION];
移除某个用户、角色的权限:
REVOKE [GRANT OPTION FOR]
priv_type [, priv_type ] ...
ON table_or_view_name
FROM principal_specification [, principal_specification] ... ;
查看某个用户、角色的权限:
SHOW GRANT [principal_name] ON (ALL| ([TABLE] table_or_view_name)