Hive - Hadoop与SQL
Hive是什么
简单来说,通过 Hive 可以使用 SQL 来查询分析 Hadoop 中的大规模数据
Hive 的思路就是将结构化的数据文件映射为数据库表,然后把SQL语句转换为MapReduce任务来执行
下面看一个简单的示例,了解下 Hive 是怎么用的
hive> select count(*) from invites;
结果信息
......
Total jobs = 1
Launching Job 1 out of 1
......
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
Stage-1 map = 0%, reduce = 0%
Stage-1 map = 100%, reduce = 0%, Cumulative CPU 2.89 sec
Stage-1 map = 100%, reduce = 100%, Cumulative CPU 5.86 sec
......
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 5.86 sec HDFS Read: 14186 HDFS Write: 103 SUCCESS
......
OK
525
Time taken: 117.23 seconds, Fetched: 1 row(s)
上面执行了一个我们熟悉的SQL查询,然后自动转为了MapReduce任务,最后输出统计结果
为什么使用Hive
在没有 Hive 的时候,对海量文件进行统计分析是比较麻烦的
例如一个日志文件,记录了用户的登录信息,如 用户名、日期、地点
现在想统计北京市的登录数据,就需要写一个mapreduce程序、打个jar包、在hadoop中运行jar,然后得到统计结果
后来又想统计某天的登录情况,还要走一遍 写程序、打包、运行 这个流程
当统计需求很多时,这个流程就非常低效了
这些统计如果用SQL的话则非常简单,而且SQL的普及度高,学习成本很低
所以有人就会想,可不可以用SQL完成Hadoop中数据文件的分析统计呢?
Hive 便产生了,把Hadoop数据文件映射成表,把SQL自动转为mapreduce程序
通用性的需求可以直接使用 SQL 来完成,对于特殊需求,可以结合自定义的mapreduce方法来处理
极大的提高了大规模数据的统计效率
用法示例
表操作
建表
hive> CREATE TABLE pokes (foo INT, bar STRING);
查看表结构
hive> DESCRIBE pokes;
OK
foo int
bar string
Time taken: 0.17 seconds, Fetched: 2 row(s)
删除表
hive> DROP TABLE pokes;
导入数据
示例文件 kv1.txt 内容
348val_348
307val_307
194val_194
414val_414
477val_477
...
把 kv1.txt 导入 pokes 表
hive> LOAD DATA LOCAL INPATH 'kv1.txt' OVERWRITE INTO TABLE pokes;
查询
例1
hive> select * from pokes where foo<5;
OK
0 val_0
4 val_4
0 val_0
0 val_0
2 val_2
Time taken: 1.706 seconds, Fetched: 5 row(s)
例2
hive> select count(*) from pokes where foo<5;
Query ID = root_20161020015023_839d455e-3591-4827-afa0-7c8b6a32b69e
......
2016-10-20 01:50:51,054 Stage-1 map = 0%, reduce = 0%
2016-10-20 01:51:42,680 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.81 sec
2016-10-20 01:52:01,509 Stage-1 map = 100%, reduce = 100%,
......
OK
5
Time taken: 101.962 seconds, Fetched: 1 row(s)
HiveQL转mapreduce的思路
背景描述
用户表
user_id |
name |
---|---|
1 |
张三 |
2 |
李四 |
订单表
user_id |
order_id |
---|---|
1 |
001 |
1 |
002 |
2 |
003 |
对两张表进行连接,统计出用户名和订单号
hive> select u.name, o.orderid from order o join user u on o. user_id = u. user_id;
MapReduce过程
- map操作
对两张表进行map操作,因为是以user_id进行关联,所以user_id作为KEY
key |
value |
---|---|
1 |
<1,张三> |
2 |
<1,李四> |
key |
value |
---|---|
1 |
<2, 001> |
1 |
<2, 002> |
2 |
<2, 003> |
value中的 1 和 2 作为分组标识
- 根据key排序
key |
value |
---|---|
1 |
<1,张三> |
1 |
<2, 001> |
1 |
<2, 002> |
2 |
<1,李四> |
2 |
<2, 003> |
- reduce操作
根据分组标识来区分,最后得出
name |
order_id |
---|---|
张三 |
001 |
张三 |
002 |
李四 |
003 |
这样就通过SQL完成了MapReduce统计
- Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)
- Django之ORM其他骚操作
- Centos 7下 FTP 服务器
- Django之views系统
- Brackets
- django之urls系统
- 最长公共子序列(稀疏序列)nlogn解法
- P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获(下)
- 3002 石子归并 3
- day2 oracle相关
- P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team
- Django 中间件
- jupyter notebook下mongodb的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MyBatis源码解析之基础模块—DataSource
- Android中Activity和Fragment传递数据的两种方式
- Android MTU 值修改的实例详解
- Android ListView填充数据的方法
- AFURLSessionManager 上传下载使用代码说明
- Android APP之WebView校验SSL证书的方法
- Android中okhttp3使用详解
- Android中RecyclerView实现Item添加和删除的代码示例
- 小程序图片上传,存储,获取,显示(含源码)
- Android网络请求框架Retrofit详解
- Android控件RadioButton实现多选一功能
- 解决Android使用Handler造成内存泄露问题
- Android中imageView图片放大缩小及旋转功能示例代码
- Android 中 ThreadLocal使用示例
- Flutter基础widgets教程-Transform篇