Hive笔记

279 阅读3分钟
原文链接: click.aliyun.com
     

     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
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                .
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    .
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        .
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            );
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                //查询某个分区上的锁
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

17.1 锁的种类

hive中的锁分为两种:共享锁和独占锁。共享锁和共享锁之间不互斥,通常在读取的时候使用共享锁,独占锁通常在写入的时候使用,它会使其他用户无法访问锁定表或分区。