HIVE参数
命名空间 | 读写权限 | 含义 |
---|---|---|
hiveconf | 可读写 | hive-site.xml当中的各配置变量 例:hive --hiveconf hive.cli.print.header=true 只当前会话有效 |
system | 可读写 | 系统变量,包含JVM运行参数等 例:set system:user.name=root 当前会话有效 在命令行中hive> |
env | 只读 | 环境变量 例:env:JAVA_HOME |
hivevar | 可读写 | 例:hive -d val=key 当前cli有效 启动hive时加入参数(用的比较少) |
a, 在命令行输入 set;当前会话中的所有变量都展示出来
b,在家目录.hivehistory中有敲过端所有命令和结果
c,家目录.hiverc中可以设置参数(hive的参数初始化)
d,set system:user.name=lisi; 设置当前用户为lisi
详述动态分区以及SQL
动态分区
动态分区: 数据自动分区,和静态分区相比,数据不需要在添加的时候直接指定分区了
1 开启动态分区
(必须设置的参数)
set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partitohn.mode=nonstricet(不是no是non)
strict时至少有一个静态分区
(可选参数)
set hive.exec.max.dynamic.partitions.pernode;
每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
所有的mr job允许创建的文件的最大数量(100000)
2 创建表
create table tb_user2(
id int,
name string,
age int,
sex string,
likes array<string>,
addrs map<string, string>)
row format
delimited
fields terminated by ","
collection items terminated by "-"
map keys terminated by ":"
lines terminated by "\n";
创建分区表
create table tb_user3(
id int,
name string,
likes array<string>,
addrs map<string, string>)
partitioned by(age int,sex string)
row format
delimited
fields terminated by ","
collection items terminated by "-"
map keys terminated by ":"
lines terminated by "\n";
from tb_user2
insert into tb_user3 partition(age,sex)
select id,name,likes,addrs,age,sex;
结果
静态分区块,动态分区开启了mapreduce任务,所以慢
hive 视图
1 不支持物化视图,每次视图都是一个子查询
2 只能查询
分桶
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
对于hive中每一个表、分区都可以进一步进行分桶。
由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。
主要适用场景:数据抽样
抽样表: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
TABLESAMPLE子句允许用户对表中数据抽样,而不是获取全表数据。 TABLESAMPLE子句可以跟在任何表的from子句之后。桶从1开始计数。colname表示通过哪列进行抽样。colname可以是表中非分区列或者rand()表示对一整行而非单个列进行抽样。表中的记录根据指定的列分桶到y个桶中(从1到y)。返回属于x桶的列。
下面SQL语句表示source表中分桶为32个桶之后返回第三个桶的数据。's’是表的别名:
SELECT * FROM source TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;
上面的效率不高
一般情况下,TABLESAMPLE会扫描整张表来获取抽样数据,效率不高。在创建表的时候可以通过clustered by子句指定一列或几列将表的数据先使用hash分区。如果TABLESAMPLE子句指定的列和clustered by子句中的列一样,TABLESAMPLE子句只扫描表中需要的hash分区并返回:
如果上面例子中,表source创建的时候使用了’clustered by id into 32 buckets’,则:
TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)
TABLESAMPLE(BUCKET X OUT OF y ON id)
N:桶的个数,一共多少桶 – 例如32个
x:第一个取端桶 --例如2
y:桶的个数或者因子,可以理解为步长-- 例如 4
32/4=8 , 取8份数据
2 ,6,10,14…30
1 开启分桶
set hive.enforce.bucketing=true;
2 创建分桶表
CREATE TABLE tb_bucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
3 导入数据(从其他表中)
insert into tb_bucket select id,name,age from tb_user2;
4 进行分桶抽样
select * from tb_bucket tablesample(bucket 2 out of 4);
权限管理
三种授权方式
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默认授权 - 设计目的仅仅只是为了防止用户产生误操作,而不是防止恶意用户访问未经授权的数据。
修改权限为hiveserver2
1 修改服务器配置文件
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
</property>
2 服务端启动hiveserver2;客户端通过beeline进行连接
3 使用命令对权限进行管理
CREATE ROLE role_name; -- 创建角色
DROP ROLE role_name; -- 删除角色
SET ROLE (role_name|ALL|NONE); -- 设置角色
SHOW CURRENT ROLES; -- 查看当前具有的角色
SHOW ROLES; -- 查看所有存在的角色
启动hiveserver2;客户端通过beeline进行连接
3 使用命令对权限进行管理
CREATE ROLE role_name; -- 创建角色
DROP ROLE role_name; -- 删除角色
SET ROLE (role_name|ALL|NONE); -- 设置角色
SHOW CURRENT ROLES; -- 查看当前具有的角色
SHOW ROLES; -- 查看所有存在的角色