在使用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
转:http://www.tbdata.org/archives/939
分享到:
相关推荐
Java作为企业级应用开发的主要语言,经常被用来处理与数据相关的任务,包括从Excel文件读取数据并生成Hive建表语句。下面我们将详细探讨如何使用Java和Apache POI库来实现这一功能。 首先,Apache POI是Java中处理...
"生成Hive建表语句"这个主题主要涉及到如何创建Hive表结构,以便存储和管理大数据。下面我们将深入探讨Hive建表的相关知识点。 首先,我们需要了解Hive的基本概念。Hive是由Facebook开源的一个数据仓库工具,它可以...
hive建表语句hive建表语句hive建表语句hive建表语句hive建表语句hive建表语句
本教程主要围绕“mysql数据抽取,自动生成hive建表语句”这一主题展开,讲解如何高效地实现这一过程。 首先,我们需要理解MySQL与Hive之间的数据模型差异。MySQL通常使用行式存储,支持复杂的事务处理,适合频繁的...
基于oracle或者mysql生成自动建表同步源数据表结构及注释
1. **Hive Metastore API**:Hive提供了Metastore服务,通过Java API可以获取到元数据信息,包括表的字段、分区等,然后自定义脚本来生成建表语句。 2. **Hive CLI或Beeline**:使用命令行工具,如`DESCRIBE ...
根据Excel记录生成Mysql和Hive建表语句
在excel模板中填写自己表的字段英文名、字段类型、字段中文名、分区英文名、分区数据类型、分区中文名、表英文名、表中文名,自动生成建表语句和查询语句,提高日常数据效率。 前提:本机安装java1.7,并且配置了...
本文主要给大家介绍了关于Mysql元数据生成Hive建表语句注释脚本的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 最近在将数据从Mysql 等其他关系型数据库 抽取到Hive 表中时,需要同步...
可以支持导出单表的建表语句,也可以支持单库所有建表语句的导出以及同服务器跨库建表语句的导出。
使用场景及目标:适用于搭建新的Hive数据存储表或者对现有的数据存储结构优化的需求场景下,用这个DDL语句可以在Hive中快速定义出所需的分区数据表结构。 其他说明:考虑到实际情况,创建表时可调整注释信息、列定义...
根据excel中表的字段清单,批量生成建表语句; 打开工具,按格式填入表名、字段、类型等内容,点击“视图”-->“宏”-->“查看宏”-->“执行”
excel动态创建hive表语句模板
Hive表生成工具,Hive表生成工具Hive表生成工具
电商业务表hive-sql建表语句
hive元数据批量生成建表语句,含存储格式、存储位置信息;使用MSSQL的sql语言。
这可能包括读取Excel或其他数据源中的表结构信息,然后自动生成对应的Hive建表语句。"自动区分分区表和非分区表"表示宏能够识别并处理两种不同类型的Hive表:普通表和分区表。分区表在大数据处理中非常常见,因为它...
Hive建表失败请使用一下命令初始化MySQLschematool -dbType mysql -initSchema相关文件课设MapReduce实现代码、Hive SQL语句、数据集仓库:https://gitee.com/A7NGHUAN/xjau-hadoop-course-design.git完整Ubuntu16...
TDH建表语句汇总 外表 ES表 es分区表 es范围分区 ORC表范围分区表 TEXT表 TEXT表是文本格式的表,是Inceptor默认的表格式。在数据量大的情况下,TEXT表的统计和查询性能 都比较低; TEXT表也不支持事务处理,所以...