数据类型

Hive 是基于 Hadoop 分布式文件系统的,它的数据存储在 Hadoop 分布式文件系统中。Hive 本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。所以往 Hive 表里面导入数据只是简单的将数据移动到表所在的目录中(如果数据是在 HDFS 上;但如果数据是在本地文件系统中,那么是将数据复制到表所在的目录中)。

Hive 中主要包含以下几种数据模型:Table(表),External Table(外部表),Partition(分区),Bucket(桶)。

  1. 表:Hive 中的表和关系型数据库中的表在概念上很类似,每个表在 HDFS 中都有相应的目录用来存储表的数据,这个目录可以通过${HIVE_HOME}/conf/hive-site.xml 配置文件中的 hive.metastore.warehouse.dir 属性来配置,这个属性默认的值是/user/hive/warehouse(这个目录在 HDFS 上),我们可以根据实际的情况来修改这个配置。如果我有一个表 wyp,那么在 HDFS 中会创建/user/hive/warehouse/wyp 目录(这里假定 hive.metastore.warehouse.dir 配置为/user/hive/warehouse);wyp 表所有的数据都存放在这个目录中。这个例外是外部表。
  2. 外部表:Hive 中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是不会被删除的,它只会删除外部表对应的元数据;而如果你要删除表,该表对应的所有数据包括元数据都会被删除。
  3. 分区:在 Hive 中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如 wyp 表有 dt 和 city 两个分区,则对应 dt=20131218,city=BJ 对应表的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。
  4. 桶:对指定的列计算其 hash,根据 hash 值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。比如将 wyp 表 id 列分散至 16 个桶中,首先对 id 列的值计算 hash,对应 hash 值为 0 和 16 的数据存储的 HDFS 目录为:/user/hive/warehouse/wyp/part-00000;而 hash 值为 2 的数据存储的 HDFS 目录为:/user/hive/warehouse/wyp/part-00002。

img

Hive 数据抽象结构图

可以看出,表是在数据库下面,而表里面又要分区、桶、倾斜的数据和正常的数据等;分区下面也是可以建立桶的。

Hive 的元数据

Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。由于 Hive 的元数据需要不断的更新、修改,而 HDFS 系统中的文件是多读少改的,这显然不能将 Hive 的元数据存储在 HDFS 中。目前 Hive 将元数据存储在数据库中,如 Mysql、Derby 中。我们可以通过以下的配置来修改 Hive 元数据的存储方式:

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive_hdp?characterEncoding=UTF-8
                    &createDatabaseIfNotExist=true</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123456</value>
  <description>password to use against metastore database</description>
</property>

当然,你还需要将相应数据库的启动复制到${HIVE_HOME}/lib 目录中,这样才能将元数据存储在对应的数据库中。(责编:周小璐)

Column Types

Column type are used as column data types of Hive. They are as follows:

Integral Types

Integer type data can be specified using integral data types, INT. When the data range exceeds the range of INT, you need to use BIGINT and if the data range is smaller than the INT, you use SMALLINT. TINYINT is smaller than SMALLINT.

The following table depicts various INT data types:

Type Postfix Example
TINYINT Y 10Y
SMALLINT S 10S
INT - 10
BIGINT L 10L

String Types

String type data types can be specified using single quotes (’ ‘) or double quotes (" “). It contains two data types: VARCHAR and CHAR. Hive follows C-types escape characters.

The following table depicts various CHAR data types:

Data Type Length
VARCHAR 1 to 65355
CHAR 255

Timestamp

It supports traditional UNIX timestamp with optional nanosecond precision. It supports java.sql.Timestamp format “YYYY-MM-DD HH:MM:SS.fffffffff” and format “yyyy-mm-dd hh:mm:ss.ffffffffff”.

Dates

DATE values are described in year/month/day format in the form {{YYYY-MM-DD}}.

Decimals

The DECIMAL type in Hive is as same as Big Decimal format of Java. It is used for representing immutable arbitrary precision. The syntax and example is as follows:

DECIMAL(precision, scale)
decimal(10,0)

Union Types

Union is a collection of heterogeneous data types. You can create an instance using create union. The syntax and example is as follows:

UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>

{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}

Literals

The following literals are used in Hive:

Floating Point Types

Floating point types are nothing but numbers with decimal points. Generally, this type of data is composed of DOUBLE data type.

Decimal Type

Decimal type data is nothing but floating point value with higher range than DOUBLE data type. The range of decimal type is approximately -10

-308

to 10

308

.

Null Value

Missing values are represented by the special value NULL.

Complex Types

The Hive complex data types are as follows:

Arrays

Arrays in Hive are used the same way they are used in Java.

Syntax: ARRAY<data_type>

Maps

Maps in Hive are similar to Java Maps.

Syntax: MAP<primitive_type, data_type>

Structs

Structs in Hive is similar to using complex data with comment.

上一页
下一页