JohnShen's Blog.

大数据入门草稿 - Hive

字数统计: 1.7k阅读时长: 6 min
2020/01/06 Share

Hive简介

Hive是Hadoop的数据仓库工具,可将结构化的数据文件映射为一张表,提供类SQL的查询功能。其本质是将HQL转化为MapReduce程序

Hive处理的数据存储在HDFS中。

Hive分析数据的默认实现是MapReduce(可以改成Spark)。

Hive执行程序运行在Yarn上。

Hive 适用于数据分析场景以及对实时性要求不高的场合。其优势在于处理大数据,对于小数据处理没有优势,Hive的执行延迟较高(MapReduce 本身具有较高的延迟)。Hive还支持用户自定义函数。

Hive的缺点在于两点:HQL表达能力有限,迭代式算法无法表达(计算结果再次处理),故在数据挖掘方面并不擅长;执行效率较低,生成的MR任务通常不够智能,且调优困难。

Hive为数仓设计,数仓内容为读多写少,因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。当然增和删是可以做到的。

Hive 架构

  • command-line shell:通过 hive 命令行的的方式来操作数据;

  • thrift/jdbc:通过 thrift 协议按照标准的 JDBC 的方式操作数据;

  • Metastore: 元数据涉及到:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

  • Driver: 主要包括以下四个:

    • SQL Parser 解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

    • Physical Plan 编译器:将AST编译生成逻辑执行计划。

    • Query Optimizer 优化器:对逻辑执行计划进行优化。

    • Execution 执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

索引

Hive没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。

基础操作

  • 启动hive: bin/hive

  • 显示数据库: show databases;

  • 使用default数据库: use default;

  • 显示default数据库中的表: show tables;

  • 删除已创建的student表: drop table student;

  • 创建student表, 并声明文件分隔符’\t’

    create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;

  • 加载/opt/module/datas/student.txt 文件到student数据库表中。

    load data local inpath ‘/opt/module/datas/student.txt’ into table student;

  • 执行脚本中的sql (-f)

    bin/hive -f /opt/module/datas/hive.sql

  • 不进入hive的交互窗口执行sql语句 (-e)

    bin/hive -e “select id from student;”

Hive常见属性

Hive数据仓库位置配置

​ 1)Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse路径下。

​ 2)在仓库目录下,没有对默认的数据库default创建文件夹。如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹。

​ 3)修改default数据仓库原始位置(将hive-default.xml.template如下配置信息拷贝到hive-site.xml文件中)。

1
2
3
4
5
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>

配置同组用户有执行权限:bin/hdfs dfs -chmod g+w /user/hive/warehouse

查询后信息显示配置

在hive-site.xml文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置。

1
2
3
4
5
6
7
8
9
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

参数配置方式

1.查看当前所有的配置信息: set;

2.参数的配置三种方式

  • 配置文件方式

默认配置文件:hive-default.xml

用户自定义配置文件:hive-site.xml

用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。

  • 命令行参数方式

启动Hive时,可以在命令行添加-hiveconf param=value来设定参数: bin/hive -hiveconf mapred.reduce.tasks=10;

注意:仅对本次hive启动有效

  • 参数声明方式

可以在HQL中使用SET关键字设定参数: hive (default)> set mapred.reduce.tasks=100;

注意:仅对本次hive启动有效。

查看参数设置: hive (default)> set mapred.reduce.tasks;

上述三种设定方式的优先级依次递增。即配置文件 < 命令行参数 < 参数声明。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。

数据类型

基本数据类型

Hive数据类型 Java数据类型 长度 例子
TINYINT byte 1byte有符号整数 20
SMALINT short 2byte有符号整数 20
INT int 4byte有符号整数 20
BIGINT long 8byte有符号整数 20
BOOLEAN boolean 布尔类型,true或者false TRUE FALSE
FLOAT float 单精度浮点数 3.14159
DOUBLE double 双精度浮点数 3.14159
STRING string 字符系列。可以指定字符集。可以使用单引号或者双引号。 ‘now is the time’ “for all good men”
TIMESTAMP 时间类型
BINARY 字节数组

复杂数据类型

数据类型 描述 语法示例
STRUCT 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 struct()
MAP MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map()
ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 Array()
CATALOG
  1. 1. Hive简介
    1. 1.1. Hive 架构
    2. 1.2. 索引
    3. 1.3. 基础操作
    4. 1.4. Hive常见属性
      1. 1.4.1. Hive数据仓库位置配置
      2. 1.4.2. 查询后信息显示配置
      3. 1.4.3. 参数配置方式
    5. 1.5. 数据类型
      1. 1.5.1. 基本数据类型
      2. 1.5.2. 复杂数据类型