Hive是一个构建在hadoop上的数据仓库框架,其目的是让精通SQL但Java编程技能相对较弱的分析师能够对存放在HDFS中的大规模数据进行执行查询。

Hive安装:下载地址:http://hive.apache.org/downloads.html

Hive配置

⑴使用XML配置文件进行设置,配置文件为conf目录下的hive-site.xml,该目录下还有hive-default.xml配置文件,其用于记录Hive使用的选项以及默认值。hive-site.xml文件适合存放详细的集群连接信息,因为可以使用Hadoop属性fs.defaultFS和yarn.resourcemanager.address来指定文件系统和资源管理器,如果没有这两个参数,则设为默认值,即使用本地文件系统和本地作业运行器。

使用--config选项参数给hive命令,来重新定义Hive查找hive-site.xml文件的目录,注意这里是目录,而不是具体的xml文件。

hive --config /xxx/xx/hive-conf

⑵hive 命令传递 -hiveconf选项来为单个会话设置属性,

hive -hiveconf fs.defaultFS=hdfs://localhost 

⑶使用SET命令更改设置,对某个特定的查询修改Hive设置,也可以使用只带属性名的SET命令查看任何属性的当前值,不带参数的SET命令会列出Hive所设置的所有属性。注意这个列表不包含Hadoop的默认值。

hive >  SET hive.enforce.bucketing=true;

优先级:4 > 3 > 1 > Hive默认值和默认文件。

Hive的运行环境:

⑴Hive的shell环境

hive > SHOW TABLES;

⑵非交互模式运行Hive的shell环境

hive -f script.q

⑶当脚本较短的时候,可使用-e 选项进行内嵌入命令

hive -e 'SELECT * FROM test'

Hive的执行引擎:

Hive的默认的执行引擎是MapReduce,还包括Apache Tez,Spark,可通过属性hive.execution.engine来控制使用哪种引擎,默认为mp(mapreduce)

Hive的日志记录:

可以本地文件/tmp中找到Hive的错误日志,如果不是,或者希望将日志目录指定到别的位置,可以通过命令:

hive -hiveconf hive.log.dir='/xxx'

日志的配置文件在conf/hive-log4j.properties中,可通过编辑这个软件来修改日志的级别和其他日志相关的设置。

Hive服务:

Hive的shell环境是服务的一种,在运行时使用--service选项指明要使用哪种服务,输入 hive --service help可以获取可用的服务列表。hive的服务有:cli,hiveserver2,beeline,hwi,jar,metastore.

如果一服务器方式运行hive(hive --service hiveserver2),则可以在应用程序中以不同机制连接到服务器。Thrift客户端,JDBC驱动,ODBC驱动方式连接到服务器。

Metastore:

metastore是Hive元数据的集中存放地,metasotre包括两部分:服务和后台数据的存储。有两种方式的metastore配置。

⑴内嵌metastore配置:

默认情况,metastore服务和Hive服务运行在同一个JVM中,它包含一个内嵌的以本地磁盘作为存储的xx数据库实例,但是,每次只能有一个内嵌xx数据库可以访问某个磁盘上的数据库文件,即一次只能为每个metastore打开一个Hive会话。

⑵本地metastore配置:

支持多会话,使用独立的数据库,因为metastore服务和Hive服务运行在同一个进程中,但连接的却是另一个进程中运行的数据库,在同一台机器上或在远程机器上。

HiveQL

Hive的SQL方言,即HiveQL,

Hive支持原子和复杂数据类型,原子数据类型包括数值型,布尔型,字符串类型和时间戳类型,复杂数据类型包括数组,映射,结构。

原子类型的命名受MySQL数据类型名称的影响,但这些数据类型基本对应于Java中的数据类型,BOOLEAN类型用于存储真值和假值,四种有符号整数类型:TINYINT,SMALLINT,INT,BIGINT,分别等价于Java的byte,short,int,long原子数据类型,分别为1,2,4,8字节有符号整数。浮点数据类型FLOAT和DOUBLE对应于Java的float和double类型,DECIMAL类型用于表示任意精度的小数,类似Java的BigDecimal类型,常用来表示货币值。。。。

复杂类型有ARRAY,MAP,STRUCT,UNION。ARRAY,MAP与Java中同名数据类型相似,STRUCT是一种记录类型,封装一个命名的字段集合,UNION是从几个数据类型中指明选择一种,UNION的值必须与这些数据类型之一完全匹配。

函数:

Hive提供很多内置函数,分几大类,数学和统计函数,字符串函数,日期函数,条件函数,聚集函数以及处理XML和JSON的函数。可在shell环境中输入 SHOW FUNCTIONS来获取函数列表。可使用DESCRIBE来查看函数的帮助。

类型转换:

Hive不会进行反向转换,回返回错误,除非使用CAST操作。

Hive可以进行隐式转换,即任何数值类型都可以隐式的转换成一个范围更广的类型或者文本类型(STRING,VARCHAR,CHAR).

表:

Hive的表在逻辑上由存储的数据和描述表中数据形式的相关元数据组成。数据一般存放在HDFS中,当然也可以放在本地文件系统中。Hive把元数据存放在关系型数据库中,而不是放在HDFS中。

Hive的表分为两种类型:一种是内部表,一种是外部表

内部表

Hive默认使用内部表,当加载数据到托管表时,Hive把数据移动到仓库目录,例如:

CRETE TABLE table_name(id STRING);

LOAD DATA INPATH ‘/xxx/xxx.txt' INTO table table_name;

这个命令会把xxx.txt文件移动到table_name的仓库目录中。

如果丢弃一个表的话,使用

DROP TABLE table_name;

使用DROP命令,会将它的元数据和数据,一起删除。

外部表:

创建外部表,Hive需要到仓库目录以外的位置访问数据,控制数据的创建和删除,外部数据的位置需要在创建表的时候指明:

CREATE EXTERNAL TABLE table_name(id STRING)  LOCATION 'xxx/table_name;

LOCAL DATA INPATH ’/xxx/xxx.txt' INTO TABLE table_name;

外部表的创建可以推迟到创建表之后才运行。当丢弃外部表的时候,Hive不会碰数据,只会删除元数据。

表的选择:

如果所有的处理都由Hive完成,则使用托管表;

如果用到Hive和其他工具来处理同一个数据集,则使用外部表。

分区和桶:

分区和桶都是为了快速的查找和遍历数据表。

1.分区

当我们使用分区时,它会按照分区列,将相同的列存储到同一个分区中,一个表可以从多个维度进行分区,还可以在原分区的基础上再进行分区,即子分区。分区在创建的时候使用PARTITIONED BY子句定义。

例如:

CREATE TABLE tableName(seq String , name String) PARTITIONED BY( id STRING,country STRING);

当把数据加载到分区表的时候,需要显式指定分区值:

LOAD DATA LOCAL INPATH 'xxx/file1' INTO TABLE tablename PARTITION (id=‘xx',country='china');

列出表的分区: 使用 SHOW PARTITIONS tablename;

2.桶

一个表可以被划分到多个桶中,我们使用CLUSTERED BY子句来指定划分桶所用的列和要划分的桶的个数:

CREATE TABLE table_name ( id INT,name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;

我们使用id作为划分桶的标记,Hive对值进行hash并将结果除以桶的个数取余数,任何一个桶中都会有一个随机的用户集合,当然有可能也没有,当数据很少。

存储格式

Hive从两个维度对表进行存储管理,分别是行格式,文件格式,行格式指行和一行中的字段如何存储,行格式的定义由SerDe定义,文件格式指一行中字段容器的格式,最简单的格式是纯文本文件,也可以使用面向行和面向列的二进制格式。

默认存储格式为:分隔的文本。如果在创建表时没有用ROW FORMAT或STORED AS 子句,那么Hive所使用的默认格式是分隔的文本,每行存储一个数据行。

 

参考《Hadoop权威指南》