Hive metastore mysql

还原建表语句见:http://www.tbdata.org/archives/939

tianzhao@ubuntu:~$ mysql -uhive -p123456
mysql> use hive
mysql> show tables;
+--------------------+
| Tables_in_hive |
+--------------------+
| BUCKETING_COLS |
| COLUMNS |
| DBS |
| PARTITIONS |
| PARTITION_KEYS |
| PARTITION_KEY_VALS |
| PARTITION_PARAMS |
| SDS |
| SD_PARAMS |
| SEQUENCE_TABLE |
| SERDES |
| SERDE_PARAMS |
| SORT_COLS |
| TABLE_PARAMS |
| TBLS |
| TBS_PRIV |
| USER |
+--------------------+
17 rows in set (0.00 sec)


下面的没有全部概括所有的字段信息:
org.apache.hadoop.hive.metastore.model.MTable:
表的信息:
public class MTable { // TBLS 表中,TBL_ID是数据库给每个hive表定义的唯一标识。
private String tableName; //表名 TBLS.TBL_NAME
private MStorageDescriptor sd; //location,columns,serDe等信息。 TBLS.SD_ID
private String owner; //表的创建者 TBLS.OWNER
private int createTime; //创建时间 TBLS.CREATE_TIME
private int lastAccessTime; //最后修改时间 TBLS.LAST_ACCESS_TIME

private List<MFieldSchema> partitionKeys; //分区字段信息 PARTITION_KEYS表中。
private Map<String, String> parameters; //相关属性信息,如表的注释属性key就是comment,value就是表的注释,还有表的其他属性信息如:transient_lastDdlTime,last_modified_by,last_modified_time。 TABLE_PARAMS表中
代码如下:
if (crtTbl.getComment() != null) {
tbl.setProperty("comment", crtTbl.getComment());
}

private String tableType; //表的类型 TBLS.TBL_TYPE
}

MTable 存在mysql的TBLS 表中:
metastore/src/model/package.jdo
[b]<class name="MTable" table="TBLS" [/b]identity-type="datastore" detachable="true">
<datastore-identity>
<column name="TBL_ID"/>
</datastore-identity>
<index name="UniqueTable" unique="true">
<column name="TBL_NAME"/>
<column name="DB_ID"/>
</index>
<field name="tableName">
<column name="TBL_NAME" length="128" jdbc-type="VARCHAR"/>
</field>
<field name="database">
<column name="DB_ID"/>
</field>
[b] <field name="partitionKeys" table="PARTITION_KEYS" >[/b]
<collection element-type="MFieldSchema"/>
<join>
<primary-key name="PARTITION_KEY_PK">
<column name="TBL_ID"/>
<column name="PKEY_NAME"/>
</primary-key>
<column name="TBL_ID"/>
</join>
<element>
<embedded>
<field name="name">
<column name="PKEY_NAME" length="128" jdbc-type="VARCHAR"/>
</field>
<field name="type">
<column name="PKEY_TYPE" length="767" jdbc-type="VARCHAR" allows-null="false"/>
</field>
<field name="comment" >
<column name="PKEY_COMMENT" length="4000" jdbc-type="VARCHAR" allows-null="true"/>
</field>
</embedded>
</element>
</field>
<field name="sd" dependent="true">
<column name="SD_ID"/>
</field>
<field name="owner">
<column name="OWNER" length="767" jdbc-type="VARCHAR"/>
</field>
<field name="createTime">
<column name="CREATE_TIME" jdbc-type="integer"/>
</field>
<field name="lastAccessTime">
<column name="LAST_ACCESS_TIME" jdbc-type="integer"/>
</field>
<field name="retention">
<column name="RETENTION" jdbc-type="integer"/>
</field>
<field name="parameters" table="TABLE_PARAMS">
<map key-type="java.lang.String" value-type="java.lang.String"/>
<join>
<column name="TBL_ID"/>
</join>
<key>
<column name="PARAM_KEY" length="256" jdbc-type="VARCHAR"/>
</key>
<value>
<column name="PARAM_VALUE" length="4000" jdbc-type="VARCHAR"/>
</value>
</field>
<field name="viewOriginalText">
<column name="VIEW_ORIGINAL_TEXT" jdbc-type="LONGVARCHAR"/>
</field>
<field name="viewExpandedText">
<column name="VIEW_EXPANDED_TEXT" jdbc-type="LONGVARCHAR"/>
</field>
<field name="tableType">
<column name="TBL_TYPE" length="128" jdbc-type="VARCHAR"/>
</field>
</class>


public class MStorageDescriptor { //存在mysql的SDS表中
private List<MFieldSchema> cols; //表的非分区字段,存在mysql的COLUMNS表中。
private String location; // 表的数据在hdfs中的路径 SDS.LOCATION
private String inputFormat;
private String outputFormat;
private boolean isCompressed = false; //是否压缩
private int numBuckets = 1;
private MSerDeInfo serDeInfo; // serDe信息,存在mysql的SERDES表中。
private List<String> bucketCols;
private List<MOrder> sortCols;
private Map<String, String> parameters; //相关参数定义。
}

<class name="MStorageDescriptor" identity-type="datastore" table="[b]SDS[/b]" detachable="true">
<datastore-identity>
<column name="SD_ID"/>
</datastore-identity>
[b]<field name="cols" table="COLUMNS" >[/b]
<collection element-type="MFieldSchema"/>
<join>
<primary-key name="COLUMNS_PK">
<column name="COLUMN_NAME"/>
</primary-key>
<column name="SD_ID"/>
</join>
<element>
<embedded>
<field name="name">
<column name="COLUMN_NAME" length="128" jdbc-type="VARCHAR"/>
</field>
<field name="type">
<column name="TYPE_NAME" length="4000" jdbc-type="VARCHAR" allows-null="false"/>
</field>
</embedded>
</element>
</field>
<field name="location">
<column name="LOCATION" length="4000" jdbc-type="VARCHAR"/>
</field>
<field name="inputFormat">
<column name="INPUT_FORMAT" length="4000" jdbc-type="VARCHAR"/>
</field>
<field name="outputFormat">
<column name="OUTPUT_FORMAT" length="4000" jdbc-type="VARCHAR"/>
</field>
<field name="isCompressed"/>
<field name="numBuckets">
<column name="NUM_BUCKETS" jdbc-type="integer"/>
</field>
<field name="serDeInfo" dependent="true">
<column name="SERDE_ID"/>
</field>
<field name="bucketCols" table="BUCKETING_COLS">
<collection element-type="java.lang.String"/>
<join>
<column name="SD_ID"/>
</join>
<element column="BUCKET_COL_NAME"/>
</field>
<field name="sortCols" table="SORT_COLS">
<collection element-type="MOrder"/>
<join>
<column name="SD_ID"/>
</join>
<element>
<embedded>
<field name="col">
<column name="COLUMN_NAME" length="128" jdbc-type="VARCHAR"/>
</field>
<field name="order">
<column name="ORDER" jdbc-type="INTEGER" allows-null="false"/>
</field>
</embedded>
</element>
</field>
<field name="parameters" table="SD_PARAMS">
<map key-type="java.lang.String" value-type="java.lang.String"/>
<join>
<column name="SD_ID"/>
</join>
<key>
<column name="PARAM_KEY" length="256" jdbc-type="VARCHAR"/>
</key>
<value>
<column name="PARAM_VALUE" length="4000" jdbc-type="VARCHAR"/>
</value>
</field>
</class>


public class MSerDeInfo { //存在mysql的SERDES表中
private String name; //默认是NULL
private String serializationLib; //使用的serde类,默认是org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
private Map<String, String> parameters;
}

<class name="MSerDeInfo" identity-type="datastore" table="[b]SERDES[/b]" detachable="true">
<datastore-identity>
<column name="SERDE_ID"/>
</datastore-identity>
<field name="name">
<column name="NAME" length="128" jdbc-type="VARCHAR"/>
</field>
<field name="serializationLib">
<column name="SLIB" length="4000" jdbc-type="VARCHAR" allows-null="true"/>
</field>
<field name="parameters" table="SERDE_PARAMS">
<map key-type="java.lang.String" value-type="java.lang.String"/>
<join>
<column name="SERDE_ID"/>
</join>
<key>
<column name="PARAM_KEY" length="256" jdbc-type="VARCHAR"/>
</key>
<value>
<column name="PARAM_VALUE" length="4000" jdbc-type="VARCHAR"/>
</value>
</field>
</class>


非分区字段存在:mysql的COLUMNS表中
分区字段存在:mysql的PARTITION_KEYS表中

// Represent a column or a type of a table or object
public class MFieldSchema { // 字段,普通字段或者分区字段
private String name; //字段名
private String type; // 字段类型
private String comment; //字段注释
}

<class name="MFieldSchema" embedded-only="true" table="TYPE_FIELDS" detachable="true">
<field name="name">
<column name="FNAME" length="128" jdbc-type="VARCHAR"/>
</field>
<field name="type" >
<column name="FTYPE" length="4000" jdbc-type="VARCHAR" allows-null="false"/>
</field>
<field name="comment" >
<column name="FCOMMENT" length="4000" jdbc-type="VARCHAR" allows-null="true"/>
</field>
</class>


字段类型,字段注释在hive中是支持中文的,编码格式设成utf8。
写入的数据是utf8,在mysql表中存的字段也要是utf8格式,在终端显示也是需要utf8显示。
很重要的一点是mysql默认的字段编码格式是 latin1,如果MySQL没有进行相关设置或者字段的CHARSET没有改过,那么字段编码就是latin1。
hive-site.xml中的javax.jdo.option.ConnectionURL需要加上characterEncoding=UTF-8
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true</value>
<description>JDBC connect string FOR a JDBC metastore</description>
</property>


mysql> SHOW CREATE TABLE COLUMNS;
| Table | Create Table
-----------------------------------------------------------------------------------------------------------------------------+
| COLUMNS | CREATE TABLE `COLUMNS` (
`SD_ID` bigint(20) NOT NULL,
`COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
`COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`TYPE_NAME` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`INTEGER_IDX` int(11) NOT NULL,
PRIMARY KEY (`SD_ID`,`COLUMN_NAME`),
KEY `COLUMNS_N49` (`SD_ID`),
CONSTRAINT `COLUMNS_FK1` FOREIGN KEY (`SD_ID`) REFERENCES `SDS` (`SD_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

所以如果mysql中的表的字段没有设置成utf8,那么hive写入的字段名和注释就会变成 ??? 乱码。
中文编码格式可以看:
深入分析 Java 中的中文编码问题
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值