|
| 1 | +## Hive简介 |
| 2 | + |
| 3 | +Hive是Facebook开源的一款基于Hadoop的数据仓库工具,是目前应用最广泛的大数据处理解决方案,它能将SQL查询转变为 MapReduce(Google提出的一个软件架构,用于大规模数据集的并行运算)任务,对SQL提供了完美的支持,能够非常方便的实现大数据统计。 |
| 4 | + |
| 5 | + |
| 6 | + |
| 7 | +> **说明**:可以通过<https://www.edureka.co/blog/hadoop-ecosystem>来了解Hadoop生态圈。 |
| 8 | +
|
| 9 | +如果要简单的介绍Hive,那么以下两点是其核心: |
| 10 | + |
| 11 | +1. 把HDFS中结构化的数据映射成表。 |
| 12 | +2. 通过把Hive-SQL进行解析和转换,最终生成一系列基于Hadoop的MapReduce任务/Spark任务,通过执行这些任务完成对数据的处理。也就是说,即便不学习Java、Scala这样的编程语言,一样可以实现对数据的处理。 |
| 13 | + |
| 14 | +Hive和传统关系型数据库的对比如下表所示。 |
| 15 | + |
| 16 | +| | Hive | RDBMS | |
| 17 | +| -------- | ----------------- | ------------ | |
| 18 | +| 查询语言 | HQL | SQL | |
| 19 | +| 存储数据 | HDFS | 本地文件系统 | |
| 20 | +| 执行方式 | MapReduce / Spark | Executor | |
| 21 | +| 执行延迟 | 高 | 低 | |
| 22 | +| 数据规模 | 大 | 小 | |
| 23 | + |
| 24 | +### 准备工作 |
| 25 | + |
| 26 | +1. 搭建如下图所示的大数据平台。 |
| 27 | + |
| 28 | +  |
| 29 | + |
| 30 | +2. 通过Client节点访问大数据平台。 |
| 31 | + |
| 32 | +  |
| 33 | + |
| 34 | +3. 创建文件Hadoop的文件系统。 |
| 35 | + |
| 36 | + ```Shell |
| 37 | + hadoop fs -mkdir /data |
| 38 | + hadoop fs -chmod g+w /data |
| 39 | + ``` |
| 40 | + |
| 41 | +4. 将准备好的数据文件拷贝到Hadoop文件系统中。 |
| 42 | + |
| 43 | + ```Shell |
| 44 | + hadoop fs -put /home/ubuntu/data/* /data |
| 45 | + ``` |
| 46 | + |
| 47 | +### 创建/删除数据库 |
| 48 | + |
| 49 | +创建。 |
| 50 | + |
| 51 | +```SQL |
| 52 | +create database if not exists demo; |
| 53 | +``` |
| 54 | +
|
| 55 | +或 |
| 56 | +
|
| 57 | +```Shell |
| 58 | +hive -e "create database demo;" |
| 59 | +``` |
| 60 | +
|
| 61 | +删除。 |
| 62 | +
|
| 63 | +```SQL |
| 64 | +drop database if exists demo; |
| 65 | +``` |
| 66 | +
|
| 67 | +切换。 |
| 68 | +
|
| 69 | +```SQL |
| 70 | +use demo; |
| 71 | +``` |
| 72 | +
|
| 73 | +### 数据类型 |
| 74 | +
|
| 75 | +Hive的数据类型如下所示。 |
| 76 | +
|
| 77 | +基本数据类型。 |
| 78 | +
|
| 79 | +| 数据类型 | 占用空间 | 支持版本 | |
| 80 | +| --------- | -------- | -------- | |
| 81 | +| tinyint | 1-Byte | | |
| 82 | +| smallint | 2-Byte | | |
| 83 | +| int | 4-Byte | | |
| 84 | +| bigint | 8-Byte | | |
| 85 | +| boolean | | | |
| 86 | +| float | 4-Byte | | |
| 87 | +| double | 8-Byte | | |
| 88 | +| string | | | |
| 89 | +| binary | | 0.8版本 | |
| 90 | +| timestamp | | 0.8版本 | |
| 91 | +| decimal | | 0.11版本 | |
| 92 | +| char | | 0.13版本 | |
| 93 | +| varchar | | 0.12版本 | |
| 94 | +| date | | 0.12版本 | |
| 95 | +
|
| 96 | +复杂数据类型。 |
| 97 | +
|
| 98 | +| 数据类型 | 描述 | 例子 | |
| 99 | +| -------- | ------------------------ | --------------------------------------------- | |
| 100 | +| struct | 和C语言中的结构体类似 | `struct<first_name:string, last_name:string>` | |
| 101 | +| map | 由键值对构成的元素的集合 | `map<string,int>` | |
| 102 | +| array | 具有相同类型的变量的容器 | `array<string>` | |
| 103 | +
|
| 104 | +### 创建和使用表 |
| 105 | +
|
| 106 | +1. 创建内部表。 |
| 107 | +
|
| 108 | + ```SQL |
| 109 | + create table if not exists user_info |
| 110 | + ( |
| 111 | + user_id string, |
| 112 | + user_name string, |
| 113 | + sex string, |
| 114 | + age int, |
| 115 | + city string, |
| 116 | + firstactivetime string, |
| 117 | + level int, |
| 118 | + extra1 string, |
| 119 | + extra2 map<string,string> |
| 120 | + ) |
| 121 | + row format delimited fields terminated by '\t' |
| 122 | + collection items terminated by ',' |
| 123 | + map keys terminated by ':' |
| 124 | + lines terminated by '\n' |
| 125 | + stored as textfile; |
| 126 | + ``` |
| 127 | +
|
| 128 | +2. 加载数据。 |
| 129 | +
|
| 130 | + ```SQL |
| 131 | + load data local inpath '/home/ubuntu/data/user_info/user_info.txt' overwrite into table user_info; |
| 132 | + ``` |
| 133 | +
|
| 134 | + 或 |
| 135 | +
|
| 136 | + ```SQL |
| 137 | + load data inpath '/data/user_info/user_info.txt' overwrite into table user_info; |
| 138 | + ``` |
| 139 | +
|
| 140 | +3. 创建分区表。 |
| 141 | +
|
| 142 | + ```SQL |
| 143 | + create table if not exists user_trade |
| 144 | + ( |
| 145 | + user_name string, |
| 146 | + piece int, |
| 147 | + price double, |
| 148 | + pay_amount double, |
| 149 | + goods_category string, |
| 150 | + pay_time bigint |
| 151 | + ) |
| 152 | + partitioned by (dt string) |
| 153 | + row format delimited fields terminated by '\t'; |
| 154 | + ``` |
| 155 | +
|
| 156 | +4. 设置动态分区。 |
| 157 | +
|
| 158 | + ```SQL |
| 159 | + set hive.exec.dynamic.partition=true; |
| 160 | + set hive.exec.dynamic.partition.mode=nonstrict; |
| 161 | + set hive.exec.max.dynamic.partitions=10000; |
| 162 | + set hive.exec.max.dynamic.partitions.pernode=10000; |
| 163 | + ``` |
| 164 | +
|
| 165 | +5. 拷贝数据。 |
| 166 | +
|
| 167 | + ```Shell |
| 168 | + hdfs dfs -put /home/ubuntu/data/user_trade/* /user/hive/warehouse/demo.db/user_trade |
| 169 | + ``` |
| 170 | +
|
| 171 | +6. 修复分区表。 |
| 172 | +
|
| 173 | + ```SQL |
| 174 | + msck repair table user_trade; |
| 175 | + ``` |
| 176 | +
|
| 177 | +### 查询 |
| 178 | +
|
| 179 | +#### 基本语法 |
| 180 | +
|
| 181 | +```SQL |
| 182 | +select user_name from user_info where city='beijing' and sex='female' limit 10; |
| 183 | +select user_name, piece, pay_amount from user_trade where dt='2019-03-24' and goods_category='food'; |
| 184 | +``` |
| 185 | +
|
| 186 | +#### group by |
| 187 | +
|
| 188 | +```SQL |
| 189 | +-- 查询2019年1月到4月,每个品类有多少人购买,累计金额是多少 |
| 190 | +select goods_category, count(distinct user_name) as user_num, sum(pay_amount) as total from user_trade where dt between '2019-01-01' and '2019-04-30' group by goods_category; |
| 191 | +``` |
| 192 | +
|
| 193 | +```SQL |
| 194 | +-- 查询2019年4月支付金额超过5万元的用户 |
| 195 | +select user_name, sum(pay_amount) as total from user_trade where dt between '2019-04-01' and '2019-04-30' group by user_name having sum(pay_amount) > 50000; |
| 196 | +``` |
| 197 | +
|
| 198 | +#### order by |
| 199 | +
|
| 200 | +```SQL |
| 201 | +-- 查询2019年4月支付金额最多的用户前5名 |
| 202 | +select user_name, sum(pay_amount) as total from user_trade where dt between '2019-04-01' and '2019-04-30' group by user_name order by total desc limit 5; |
| 203 | +``` |
| 204 | +
|
| 205 | +#### 常用函数 |
| 206 | +
|
| 207 | +1. `from_unixtime`:将时间戳转换成日期 |
| 208 | +2. `unix_timestamp`:将日期转换成时间戳 |
| 209 | +3. `datediff`:计算两个日期的时间差 |
| 210 | +4. `if`:根据条件返回不同的值 |
| 211 | +5. `substr`:字符串取子串 |
| 212 | +6. `get_json_object`:从JSON字符串中取出指定的`key`对应的`value`,如:`get_json_object(info, '$.first_name')`。 |
| 213 | +
|
0 commit comments