51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 8342|回复: 1
打印 上一主题 下一主题

hive 元数据解析(转)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-10-24 10:43:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
转自:http://www.tbdata.org/archives/939

在使用hive进行开发时,我们往往需要获得一个已存在hive表的建表语句(DDL),然而hive本身并没有提供这样一个工具。
要想还原建表DDL就必须从元数据入手,我们知道,hive的元数据并不存放在hdfs上,而是存放在传统的RDBMS中,典型的如mysql,derby等,这里我们以mysql为元数据库,结合0.4.2版本的hive为例进行研究。
连接上mysql后可以看到hive元数据对应的表约有20个,其中和表结构信息有关的有9张,其余的10多张或为空,或只有简单的几条记录,以下是部分主要表的简要说明。
表名        说明        关联键
TBLS        所有hive表的基本信息        TBL_ID,SD_ID
TABLE_PARAM        表级属性,如是否外部表,表注释等        TBL_ID
COLUMNS        Hive表字段信息(字段注释,字段名,字段类型,字段序号)        SD_ID
SDS        所有hive表、表分区所对应的hdfs数据目录和数据格式        SD_ID,SERDE_ID
SERDE_PARAM        序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等        SERDE_ID
PARTITIONS        Hive表分区信息        PART_ID,SD_ID,TBL_ID
PARTITION_KEYS        Hive分区表分区键        TBL_ID
PARTITION_KEY_VALS        Hive表分区名(键值)        PART_ID
除了上面几张表外,还有两张表非常有趣:NUCLEUS_TABLES和SEQUENCE_TABLE
NUCLEUS_TABLES表中保存了元数据表和hive中class类的对应关系,如’org.apache.hadoop.hive.metastore.model.MTable’, ‘`TBLS`’,说明MTable类对应了元数据的TBLS表,不难想象当我们创建一张表时,hive一定会通过MTable的DAO模式向TBLS插入一条数据用来描述刚刚创建的hive表。NUCLEUS_TABLES表内现在共有17条这样的记录。
SEQUENCE_TABLE表保存了hive对象的下一个可用ID,如’org.apache.hadoop.hive.metastore.model.MTable’, 271786,则下一个新创建的hive表其TBL_ID就是271786,同时SEQUENCE_TABLE表中271786被更新为271791(这里每次都是+5而不是预料中的+1,有些奇怪)。同样,COLUMN,PARTITION等都有相应的记录。
从上面两张表的内容来看,hive表创建表的过程已经比较清楚了
解析用户提交hive语句,对其进行解析,分解为表、字段、分区等hive对象
根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新ID,与构建对象信息(名称,类型等)一同通过DAO方法写入到元数据表中去,成功后将SEQUENCE_TABLE中对应的最新ID+5。
实际上我们常见的RDBMS都是通过这种方法进行组织的,典型的如postgresql,其系统表中和hive元数据一样裸露了这些id信息(oid,cid等),而Oracle等商业化的系统则隐藏了这些具体的ID。
有了上面的信息,再想获得hive的建表语句已经是易如反掌了,这里提供一个已经开发好的脚本,使用shell开发,大家可以自由修改。注意:其中mysql连接信息请根据实际环境进行配置。
点击下载
使用方法如下:
hivesql sql   <table|file>         —  获取指定hive表或指定文件中所有hive表的DDL,如果有按天的分区则默认执行最近7天的分区DDL。同时,table支持符合sql语法的正则表达式,如果有多个表匹配,则提示用户选择(使用file则自动关闭该交互功能)。
hivesql synctab <table|file>  — 基本同上,但是会将得到的DDL提交到当前的hive环境,可用来在不同的hive环境中复制表结构。
如果需要多天分区DDL还可以这样用(前提是分区中含有日期信息,如pt=20100720):
hivesql sql s_table 20100702                      — 除建表语句外,获得自20100702以来的分区DDL
hivesql sql s_table 20100702 20100725  — ………………………..自20100702-20100725的分区DDL
hivesql sql s_table 20100702 10                 — ………………………..自20100702起10天的分区DDL
hivesql synctab和hivesql sql一样支持上述日期限定功能。
此外,还提供了两个附加的功能(也很有用呃)
hivesql loc <reg>             —  根据关键字查找能够匹配到的hive表或对应的数据路径
hivesql hdfswc  <hdfsdir>  — 获取指定数据目录下所有数据的总行数,支持普通文本,TextFile和SequenceFile的压缩格式,类似于linux下的wc -l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2019-8-8 10:22
  • 签到天数: 15 天

    连续签到: 2 天

    [LV.4]测试营长

    2#
    发表于 2019-7-3 15:13:30 | 只看该作者
    数据解析相关测试用例设计。。。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-25 13:03 , Processed in 0.066459 second(s), 26 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表