BigBrother的大数据之旅Day 11 hive(2)

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";

1564972512537

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;  -- 查看所有存在的角色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值