14.2.2 JSON SerDe
JsonSerde来自于第三方,可以用于查询json格式的记录。例如:
create
external
table
messages
(
msg_id
bigint
,
tstamp
string
,
text
string
,
user_id
bigint
,
user_name
,
string
)
row
format
serde
"org.apache.hadoop.hive.contrib.serde2.JsonSerde"
with
serdeproperties
(
"msg_id"
=
"$.id"
,
"tstamp"
=
"$.created_at"
,
"text"
=
"$.text"
,
"user_id"
=
"$.user.id"
,
"user_name"
=
"$.user.name"
)
location
'/data/messages'
;
row format serde用于指定使用的SerDe,with serdeproperties用于给SerDe传递属性信息,上面的例子中用这些属性将json文档和表的字段对应起来。定义好之后,就可以像通常一样执行查询:select * from messages;
14.3 文件压缩
压缩可以节省磁盘存储空间,减小磁盘和网络I/O时间。Hive表的文件存储在hadoop上,可以使用hadoop提供的压缩对文件进行压缩。除此以外,hive也提供了两个跟压缩相关的特有设置:(1)开启中间压缩 hive.exec.compress.intermediate
对中间数据进行压缩可以减少job中map和reduce task间的数据传输量
(2)最终输出结果压缩 hive.exec.compress.output和mapred.output.compression.codec
十五、存储处理程序和NoSQL
存储处理程序可以将外部实体表作为标准的hive表进行处理,它包含了InputFormat、OutputFormat、SerDe和Hive需要使用的特定的代码。例如可以将Hbase、Cassandra、DynamoDB这样的NoSQL数据库中的表作为hive表来处理,下面是创建一个指向Hbase表的Hive表:
create
table
habase_stocks
(
key
int
,
name
string
,
price
float
)
stored
by
'org.apache.hive.hbase.HBaseStorageHandler'
with
serdeproperties
(
"hbase.columns.mapping"
=
":key,stock:val"
)
tblproperties
(
"hbase.table.name"
=
"stocks"
);
十六、权限
默认情况下,授权模块是不开启的,需要将属性hive.security.authorization.enabled设置为true。16.1 用户、组和角色
hive中的用户和组是外部系统的用户和组,比如当使用HiveCLI方式来访问hive时,此时的用户和组就对应linux系统当前用户和组。角色是hive自己创建的,它的使用比较灵活。可以为一个角色赋予权限,然后给用户设置该角色,这样用户就拥有了该角色所拥有的权限。16.2 权限种类
下面列举了可以配置的权限:| 名称 | 描述 |
| all | 所有的权限 |
| alter | 修改表结构的权限 |
| create | 创建表的权限 |
| drop | 删除表或表中的分区的权限 |
| index | 创建表索引的权限 |
| lock | 开启并发后,锁定和解锁表的权限 |
| select | 查询表或者分区中数据的权限 |
| show_database | 查看所有数据库的权限 |
| update | 向表或者分区中插入或加载数据的权限 |
例如为用户edward赋予在数据库edsstuff中create权限:
grant
create
on
database
edsstuff
to
user
edward;
16.3 分区级别的授权
默认情况下,是在表级别授予权限的,但是可以在分区级别进行授权,将表属性partition_level_privilege设置为true即可。如下面的例子:
create
table
autorized_part
(
key
int
,
value
string
)
partitioned
by
(ds
string
)
;
//创建一张分区表autorized_part
alter
table
autorized_part
set
tblproperties
(
"partition_level_privilege"
=
"true"
);
//为该表开启分区级别的授权
alter
table
autorized_part
add
partition
(ds
=
'3'
);
//为表新增一个分区,值为3
revoke
select
on
table
autorized_part
partition
(ds
=
'3'
)
from
user
edward;
//给edward赋予分区ds='3'的select
权限
十七、锁
hive不支持行级别的更新和删除,也不支持事务,因此细粒度锁对hive是没有必要的。hive提供了表级别和分区级别的锁,这需要配合zookeeper来使用。在hive-site.xml配置文件中,增加hive.zookeeper.quorum属性来指定zookeeper集群的地址,同时设置hive.support.concurrency为true,开启支持并发。
show
locks;
//查询当前所有锁
show
locks
表名;
//查询某张表上的锁
show
locks
表名
partition
(
.
.
.
);
//查询某个分区上的锁