在使用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表创建表的过程已经比较清楚了

  1. 解析用户提交hive语句,对其进行解析,分解为表、字段、分区等hive对象
  2. 根据解析到的信息构建对应的表、字段、分区等对象,从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

hive 元数据解析的更多相关文章

  1. [Hive]HiveSQL解析原理

    Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和 ...

  2. 大数据学习(11)—— Hive元数据服务模式搭建

    这一篇介绍Hive的安装及操作.版本是Hive3.1.2. 调整部署节点 在Hadoop篇里,我用了5台虚拟机来搭建集群,但是我的电脑只有8G内存,虚拟机启动之后卡到没法操作,把自己坑惨了. Hive ...

  3. 如何监听对 HIVE 元数据的操作

    目录 简介 HIVE 基本操作 获取 HIVE 源码 编译 HIVE 源码 启动 HIVE 停止 HIVE 监听对 HIVE 元数据的操作 参考文档 简介 公司有个元数据管理平台,会定期同步 HIVE ...

  4. hive元数据研究

    hive的元数据存放在关系型数据库中,元数据中存储了hive中所有表格的信息,包括表格的名字,表格的字段,字段的类型,注释.这些信息分散的存放在各个表中,给定一个hive中的表格名字,查询这个表中含有 ...

  5. spark on yarn模式下配置spark-sql访问hive元数据

    spark on yarn模式下配置spark-sql访问hive元数据 目的:在spark on yarn模式下,执行spark-sql访问hive的元数据.并对比一下spark-sql 和hive ...

  6. ADO.NET实体框架Entity Framework模型-基于元数据解析

           上一篇简单介绍了EF的XML模型结构,在基于xml解析一文中,主要使用xml查询技术Xpath,XQuery来得到实体模型中相应信息的,由于这种方式在数据库庞大,表关系复杂的情况下,有诸 ...

  7. hive中解析json数组

    -- hive中解析json数组 select t1.status ,substr(ss.col,,) as col ,t3.evcId ,t3.evcLicense ,t3.evcAddress , ...

  8. Hive元数据启动失败,端口被占用

    org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0. ...

  9. Hive部分函数解析

    Hive部分函数解析 Hive里的exists ,in ,not exists ,not in 相关函数 表数据准备: 1.选择指定数据库 eg:  use bg_database1; 2. 创建表 ...

随机推荐

  1. Z算法

    Z算法 Z算法是一种用于字符串匹配的算法.此算法的核心在于\(z\)数组以及它的求法. (以下约定字符串下标从\(1\)开始) \(\bm z\)数组和Z-box 定义\(z\)数组:\(z_{a,i ...

  2. SAP Special Fields in FAGLL03 transaction

    https://wiki.scn.sap.com/wiki/display/ERPFI/Special+Fields+in+FAGLL03+transaction https://wiki.scn.s ...

  3. 解决MobaXterm-SSH中文乱码问题

    一般情况不用修改服务器字符集(linux或unix服务器字符集一般不会设置错误). 1.首先用命令查看当前系统的LANG是什么: >locale LANG=en_US LC_COLLATE=&q ...

  4. Mongodb最基础入门教程

      Mongodb最基础入门教程 如果想了解一下redis的入门教程,可以去看一下我的上一篇博客 Mongodb的安装大家可以参考一下其他博主的博客,这里我就不做介绍了.不过值得注意的是,在Linux ...

  5. Spring Context 你真的懂了吗

    今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识. 1. context 是什么 我们经常在编程中见到 contex ...

  6. nginx之location详解

    location有定位的意思,根据uri来进行不同的定位,在虚拟主机中是必不可少的,location可以定位网站的不同部分,定位到不同的处理方式上. location匹配分类 精准匹配 一般匹配 正则 ...

  7. Linux应用开发自学之路

    前言 在 「关于我 」那篇博文里,朋友们应该知道了我不是科班出身,是由机械强行转行到Linux应用开发方向.下面我就详细向大家介绍自己这一路上的转行历程,希望对大家有所启发. 我是学机械专业的,对于机 ...

  8. 设计模式(C#)——09外观模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言       在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然 ...

  9. css3的@media

    都知道bootstrap响应式布局很酷,但是是怎么实现的呢?其官网首页有提到这一切的功劳都是来自于CSS 媒体查询(Media Query). 使用 @media 查询,你可以针对不同的媒体类型定义不 ...

  10. VS code 进行 flutter 调试时启动后就停止,无法调试的问题

    在编写flutter时,更新需要按 r 或着 R,这就有点麻烦,当然强大的VS code给我们提供了自动更新的功能,那就是调试功能. 首先需要给VS code安装Flutter与Dart插件. 在VS ...