`
bupt04406
  • 浏览: 344806 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hive metastore mysql

    博客分类:
  • Hive
阅读更多
还原建表语句见: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
    <class name="MTable" table="TBLS" 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>
     <field name="partitionKeys" table="PARTITION_KEYS" >
        <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="SDS" detachable="true">
      <datastore-identity>
        <column name="SD_ID"/>
      </datastore-identity>
      <field name="cols" table="COLUMNS" >
        <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="SERDES" 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&amp;characterEncoding=UTF-8&amp;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/



分享到:
评论

相关推荐

    cloudera manager中添加hive数据库使用mysql的配置步骤

    cloudera manager中添加hive数据库使用mysql的配置的详细步骤

    Hive安装讲义(linux_hive windows_mysql)

    Hive安装讲义(linux_hive windows_mysql) Hive是基于Hadoop的数据仓库工具,用于存储、查询和分析大规模数据。为了实现Hive的安装和配置,需要满足一定的前提条件和环境要求。下面是Hive安装讲义的详细步骤和相关...

    腾讯数据湖的元数据治理

    同时,腾讯数据湖也支持不同的元数据类型,包括Hive、MySQL等。 在在线目录中,腾讯数据湖使用了业界方案Hive Metastore,为SQL on Hadoop提供通用Schema管理。Hive Metastore可以与计算引擎无缝对接,提供了更好的...

    Hive2.3.4安装文档

    &lt;name&gt;hive.metastore.warehouse.dir &lt;value&gt;/user/hive/warehouse &lt;!-- hive查询时输出列名 --&gt; &lt;name&gt;hive.cli.print.header &lt;value&gt;true &lt;!-- 显示当前数据库名 --&gt; &lt;name&gt;hive.cli.print.current...

    hivesql语句练习

    5.安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下 如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行) mysql -uroot -p #(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址...

    大数据Hive数仓开发精讲到企业级实战应用

    ├─01.视频 │ │ 02--数据仓库基础理论--场景...│ │ 21--Apache Hive--安装部署--远程模式安装与metastore服务启动.avi │ │ 25--Apache Hive--初体验1--Hive使用起来和MySQL差不多吗?.avi │ │  │ 

    Hive学习总结及应用.pdf

    目前Hive将元数据存储在数据库中,如Mysql、Derby中。 四、Hive元数据存储方式 Hive的元数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。远端存储比较适合生产环境。 1. 使用Derby数据库存储元...

    hive语法和常用函数[归纳].pdf

    内部表:Hive中的表和传统数据库中的表在概念上是类似的,Hive的每个表都有自己的存储目录,除了外部表外,所有的表数据都存放在配置在hive-site.xml文件的${hive.metastore.warehouse.dir}/table_name目录下。...

    hive远程连接详细配置

    hive远程连接的详细配置,包括远程mysql,远程存储metastore

    配置hive元数据到Mysql中的全过程记录

    在hive的安装目录下,进入conf目录,创建...将mysql驱动复制到hive的lib目录里。(这有关上一篇安装MySQL的内容) 解压驱动包 将mysql驱动复制到hive的lib目录里 启动hive(别忘了先启动hdfs和yarn~~) start-dfs.s

    基于Spark+Hive实现用户画像分析系统(含价值度、忠诚度、流失预警、活跃度等分析模型).zip

    存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎&lt;===&gt; 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生...

    基于Django2.2+MySQL+spark的在线电影推荐系统设计与实现.zip

    存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎&lt;===&gt; 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生...

    在CentOS7中安装Hive1.2.2

    `&lt;value&gt;jdbc:mysql://hadp01:3306/hive?createDatabaseIfNotExist=true&lt;/value&gt;` `&lt;description&gt;JDBC connect string for a JDBC metastore&lt;/description&gt;` `&lt;/property&gt;` `&lt;property&gt;` `&lt;name&gt;javax.jdo.option....

    hive语法和常用函数.doc

    内部表和传统数据库中的表在概念上是类似的,Hive的每个表都有自己的存储目录,除了外部表外,所有的表数据都存放在配置在hive-site.xml文件中的 ${hive.metastore.warehouse.dir}/table_name目录下。 Hive的优点...

    Spark和Hive的结合(让hive基于spark计算)

     jdbc:mysql://192.168.224.132:3306/hive?createDatabaseIfNotExist=true  JDBC connect string for a JDBC metastore        javax.jdo.option.ConnectionDriverName  com.mysql.jdbc.Driver  Driver

    第4集-Hadoop环境搭建 - linux(centos7) - 安装配置mysql5.5.44.pdf

    sudo rm -rf /home/hadoop/hive-2.1.1/scripts/metastore/upgrade/mysql 4. 下载Mysql5.5.44 下载Mysql5.5.44,不要下载高版本的Mysql。下载地址:(不需要输入Oracle账号密码)。 5. 解压缩tar文件 使用tar命令...

    基于Spark+PageRank算法构建仿微博用户好友的分布式推荐系统.zip

    存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎&lt;===&gt; 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生...

    基于spark+drools+kafka+redis的大数据实时风控系统.zip

    存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎&lt;===&gt; 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生...

    毕业设计--基于Django的电影推荐系统和论坛,采用协同过滤及als算法.zip

    存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎&lt;===&gt; 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生...

    基于Spark的电影推荐系统,包含爬虫项目、web网站、后台管理系统以及spark推荐系统.zip

    存储层:HDFS作为底层存储,Hive作为数据仓库 (Hive Metastore:Hive管理数据的schema) 离线数据处理:SparkSQL (做数据查询引擎&lt;===&gt; 数据ETL) 实时数据处理:Kafka + Spark Streaming 数据应用层:MLlib 产生...

Global site tag (gtag.js) - Google Analytics