`
bupt04406
  • 浏览: 347789 次
  • 性别: 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/



分享到:
评论

相关推荐

    Hive metastore 使用达梦数据库存储元数据

    通常,Hive元数据默认存储在MySQL或Derby等关系型数据库中。然而,为了适应更复杂的业务需求和更高的性能,我们可以选择将Hive元数据存储在达梦数据库中。本文将详细介绍如何配置Hive metastore以使用达梦数据库。 ...

    详细调研hivemetastore管理机制.zip

    《深入理解Hive Metastore管理机制》 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,因其易用性和高效性而被广泛应用。其中,Hive Metastore是Hive的核心组件之一,它负责管理和存储元数据,是理解和...

    hive远程连接详细配置

    在这个配置中,我们将介绍如何配置 Hive 客户端与 Hive 服务器的连接,包括远程 MySQL 和远程存储 metastore 的配置。 Hive 客户端配置 在 Hive 客户端配置中,我们需要配置 Hive 客户端连接到远程 metastore ...

    大数据入门HIVE和MySQL安装包

    4. **创建Metastore数据库**:在MySQL中创建用于存储Hive元数据的数据库和用户。 5. **启动Hive**:启动Hive Server2和Hive Metastore服务,可以通过`hive`命令进入交互式shell。 **MySQL介绍** MySQL是一种快速、...

    hive3.1.2+mysql驱动.zip

    本地元数据存储将元数据保存在运行Hive Metastore服务的同一台服务器上,而远程元数据存储则允许在独立的数据库服务器上管理元数据。MySQL作为流行的开源关系型数据库管理系统,常被用作Hive的远程元数据存储。 ...

    hive-mysqlconnector.rar

    此外,Hive通过Hive Metastore服务来管理和存储元数据,包括表的定义、分区信息等,这些元数据通常会存储在关系型数据库中,如MySQL。 “mysql-connector-java-5.1.49.jar”是MySQL数据库的Java连接器,它是MySQL ...

    Hive_mysql教学安装视频.zip

    4. **初始化Hive元数据**:启动Hive Metastore服务,首次启动会自动在MySQL中创建所需的表结构。 5. **测试连接**:通过Hive命令行工具连接到MySQL,验证配置是否正确。运行`show tables;`等命令检查是否能正常获取...

    hive1.2.1-mysql-connector.rar

    在Hive中,当选择MySQL作为元数据存储时,这个驱动文件是必需的,因为它使得Hive Metastore服务能够与MySQL数据库通信,存储表信息、分区信息、列信息等元数据。 知识点详细说明: - **Apache Hive**:Hive是一个...

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

    在Cloudera Manager中配置Hive使用MySQL数据库涉及多个步骤,从卸载CentOS默认MySQL到配置完毕,下面详细说明每一步的知识点。 首先,确保在添加Hive数据库前,系统中不存在先前安装的MySQL版本。使用命令rpm -qa |...

    mysql-connector-java-5.1.32.7z

    总的来说,MySQL Connector/J 5.1.32 在 Hive 中的应用,让开发者能够利用已有的 MySQL 数据库作为 Hive Metastore,从而实现更高效、可靠的元数据管理,同时充分利用 MySQL 的成熟特性和高可用性。在实际操作中,...

    apache-hive-3.1.2+mysql-connector-java-5.1.32-bin.jar

    7. 初始化元数据:使用Hive的metastore工具初始化数据库,创建必要的表。 8. 启动Hive:启动Hiveserver2服务,然后通过Hive CLI或者Beeline等客户端工具与Hive交互。 在Hive中,用户可以通过HQL(Hive Query ...

    Metastore组件

    Hive Metastore一般采用数据库系统来存储元数据,支持的数据库包括MySQL、PostgreSQL、Derby等。Metastore服务通常以独立服务的形式运行,这样可以为多个Hive实例提供共享的元数据访问服务,从而实现元数据的集中...

    hive-3.1.2&mysql-5.7.2安装包.rar

    在 Hive 中设置 metastore(元数据存储)连接,可以选择本地 MySQL 实例作为 metastore 服务,这将提高 Hive 的性能和数据一致性。 总的来说,这个安装包提供了在大数据环境中使用 Hive 进行数据处理并与 MySQL ...

    Hive安装,使用MySQL作为元数据库

    &lt;value&gt;jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true &lt;description&gt;JDBC connect string for a JDBC metastore &lt;name&gt;javax.jdo.option.ConnectionDriverName &lt;value&gt;...

    hive-1.1.0-cdh5.14.2.tar.gz和mysql-connector-java-5.1.38.jar连接包

    6. **Hive与MySQL的集成**: 在配置Hive时,通过修改`hive-site.xml`配置文件,指定MySQL为元数据存储,并加载`mysql-connector-java-5.1.38.jar`到Hive的类路径中,就可以实现两者间的连接。 7. **HiveQL**: Hive...

    sparksql连接mysql,hive

    在本教程中,我们将探讨如何将SparkSQL与MySQL和Hive集成,以便在大数据处理中实现更高效的数据操作。首先,我们需要确保所有必要的组件都已安装并正确配置。 1. **Java安装**: - Java是所有这些组件的基础,因此...

    hive相关jar包

    2. **Hive Metastore**:这部分jar包用于存储Hive的元数据,包括表结构、分区信息、列类型等。元数据可以存储在本地MySQL、PostgreSQL或者远程Thrift服务器上。 3. **Hive SerDes(Serialization/Deserialization)...

    apache-hive-1.1.0-cdh5.7.1-bin.tar.gz

    2. 解压`apache-hive-1.1.0-cdh5.7.1-bin.tar.gz`,配置`conf/hive-site.xml`以指向MySQL metastore,并设置其他必要的参数,如Hadoop配置目录等。 3. 启动Hive Metastore服务。 4. 初始化Hive Metastore,创建所需...

    基于虚拟机hadoop集群hive2.1.1配置文件

    1. **mysql-connector-java-5.1.43-bin.jar**:这是一个MySQL的JDBC驱动,用于Hive与MySQL数据库之间的通信。在Hive中,元数据通常存储在关系型数据库如MySQL中,以便管理和检索。因此,我们需要把这个JDBC驱动添加...

    8、NIFI综合应用场景-NiFi监控MySQL binlog进行实时同步到hive

    - **HiveMetastoreClientService**: 提供与Hive Metastore交互的能力,用于元数据管理。 ### 操作与验证 1. **配置验证**:确保NiFi、MySQL、Hive环境正常运行,所有需要的连接和配置参数(如数据库URL、用户名、...

Global site tag (gtag.js) - Google Analytics