众所周知,hive 表中的数据是 HDFS 上的文件,可是 hive 怎么知道这些文件的内容都对应哪个字段,对应哪个分区呢?
就是 hive 的元数据管理着这一切。通常在 hive-site.xml 中的元数据库配置成 MySQL,替换 Derby。
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql:///metastore?createDatabaseIfNotExists=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
下面我们进 MySQL 看看元数据的表具体有哪些。
1.VERSION
这个存 hive 版本,有且仅有一条数据
如果多了,会报错
Caused by: MetaException(message:Metastore contains multiple versions (2)
2. 库相关表
DBS 是数据库主表,字段名顾名思义,样例数据如下
DATABASE_PARAMS 是创建数据库 WITH DBPROPERTIES (property_name=property_value, …)指定的参数
FUNCS 是函数表
FUNC_RU 是函数在哪个 jar 包中
3. 表相关表
PS: 调整里半天位置来截个图,感觉像站队合影一样……哈哈
TBLS 是表的主表,存放 hive 所有表的主要信息,其中TBL_TYPE
是表类型,MANAGED_TABLE
表示内部表,EXTERNAL_TABLE
表示外部表
TABLE_PARAMS 是表参数,类似 DATABASE_PARAMS
TBL_PRIVS,TBL_COL_PRIVS 分别是表权限与列权限
PARTITION_KEYS 是分区信息表,INTEGER_IDX
是分区字段序号
PARTITIONS 是具体的分区记录,当某表添加新的分区时,会增加一条记录
4. 存储相关表
SDS 是存储主表,包含数据文件的输入输出格式,所在 HDFS 路径,是否压缩等
COLUMNS_V2 是列的信息,INTEGER_IDX 是列的下标,对应文件的内容顺序
SD_PARAMS 是在创建表时候使用 STORED BY‘storage.handler.class.name’[WITH SERDEPROPERTIES (…)指定
SERDES 是序列化使用类的表
SERDE_PARAMS 存储列分隔符,行分隔符等
在序列化参数表中记录列的分隔符,意味着 Hive 的存储是对每个字段各自序列化的。
参考博客:
https://www.jianshu.com/p/ccf…
https://www.cnblogs.com/11301…