0%

Hive

1. 基本概念

1.1. 什么是Hive

  1. 简介

    是基于Hadoop的数仓工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能,

  2. Hive本质:

    将HQL转化为MapReduce程序

    1. Hive处理的数据存储在HDFS上
    2. Hive分析数据底层的实现是MapReduce
    3. 执行程序运行在Yarn上

1.2. 优缺点

1.2.1. 优点

  1. 接口采用类sql语法,提供快速开发能力(简单,容易上手)。
  2. 避免写MapReduce,减少学习成本
  3. Hive执行延迟比较高,常用于数据分析,对实时性要求不高的场景。
  4. 优势在于处理大数据
  5. 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

1.2.2. 缺点

  1. HQL表达能力有限
    1. 迭代式算法无法表达
    2. 数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法无法实现
  2. Hive的效率比较低
    1. Hive自动生成MapReduce作业,通常情况下不够智能
    2. 调优比较困难,粒度较粗

1.3. 架构

  1. 用户接口: Client

    CLI(hive shell),JDBC/ODBC, WEBUI

  2. 元数据:Metastore

    元数据包括:表名。表所属的数据库,表的拥有者,列/分区字段,表的类型(是否是外部表),表的数据所在目录等;

    默认存储在自带的derby数据库中,推荐使用MySql.

1.3.2. 运行机制

2. 数据类型

2.1. 基本数据类型

数据类型

2.2. 复杂数据类型

Struct, Map, Arrary

举例:

假设有以下数据:

1
2
3
4
5
6
7
8
9
10
11
12
{
"name":"zhangsan",
"friends":["lisi", "wangwu"],
"children": {
"lao da":18,
"lao er":17
},
"address": {
"street": "zhong guan cun",
"city": "beijing"
}
}

有以下文本文件:

1
2
zhangsan,lisi_wangwu,lao da:18_lao er:17,zhong guan cun_beijing
zhaoliu,lisi_wangwu,lao da:19_lao er:13,chao yang_beijing

注意:Map,Struct和Array里的元素关系都可以用同一个字符表达,这里用”_”

建表:

1
2
3
4
5
6
7
8
9
10
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';

从文件中添加数据:

1
2
3
4
hive> load data local inpath '/home/bruce/SoftWare/apache-hive-2.3.7-bin/test/test' into table test;
Loading data to table default.test
OK
Time taken: 0.599 seconds

查看数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
hive> select * from test;
OK
zhangsan ["lisi","wangwu"] {"lao da":18,"lao er":17} {"street":"zhong guan cun","city":"beijing"}
zhaoliu ["lisi","wangwu"] {"lao da":19,"lao er":13} {"street":"chao yang","city":"beijing"}
Time taken: 0.991 seconds, Fetched: 2 row(s)
hive> select friends from test;
OK
["lisi","wangwu"]
["lisi","wangwu"]
Time taken: 0.159 seconds, Fetched: 2 row(s)
hive> select friends[1] from test;
OK
wangwu
wangwu
Time taken: 0.349 seconds, Fetched: 2 row(s)
hive> select children from test;
OK
{"lao da":18,"lao er":17}
{"lao da":19,"lao er":13}
Time taken: 0.126 seconds, Fetched: 2 row(s)
hive> select children['lao da'] from test;
OK
18
19
hive> select address.city from test;
OK
beijing
beijing
Time taken: 1.657 seconds, Fetched: 2 row(s)