首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
Hadoop面试复习系列——HDFS(一)
2
大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和Seconda
3
大数据技术之_05_Hadoop学习_02_MapReduce_MapReduce框架原理+InputFormat数据输入+MapReduce工作流程(面试重点)+Shuffle机制(面试重点)
4
大数据技术之_05_Hadoop学习_01_MapReduce_MapReduce概述+Hadoop序列化
5
大数据技术之_03_Hadoop学习_01_入门_大数据概论+从Hadoop框架讨论大数据生态+Hadoop运行环境搭建(开发重点)
6
大数据技术之_05_Hadoop学习_04_MapReduce_Hadoop企业优化(重中之重)+HDFS小文件优化方法+MapReduce扩展案例+倒排索引案例(多job串联)+TopN案例+找博客
7
大数据技术之_06_Zookeeper学习_Zookeeper入门+Zookeeper安装+Zookeeper内部原理+Zookeeper实战(开发重点)+企业面试真题
8
大数据技术之_09_Hive学习_复习与总结
9
大数据技术之_07_Hadoop学习_HDFS_HA(高可用)_HA概述+HDFS-HA工作机制+HDFS-HA集群配置+YARN-HA配置+HDFS Federation(联邦) 架构设计
10
大数据技术之_08_Hive学习_01_Hive入门+Hive安装、配置和使用+Hive数据类型
11
大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)
12
大数据技术之_08_Hive学习_05_Hive实战之谷粒影音(ETL+TopN)+常见错误及解决方案
13
大数据技术之_08_Hive学习_02_DDL数据定义(创建/查询/修改/删除数据库+创建表+分区表+修改表+删除表)+DML数据操作(数据导入+数据导出+清除表中数据)
14
大数据技术之_08_Hive学习_03_查询+函数
15
大数据技术之_16_Scala学习_09_函数式编程-高级
16
大数据技术之_09_Flume学习_Flume概述+Flume快速入门+Flume企业开发案例+Flume监控之Ganglia+Flume高级之自定义MySQLSource+Flume企业真实面试题(
17
大数据技术之_13_Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战
18
大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例
19
大数据技术之_12_Sqoop学习_Sqoop 简介+Sqoop 原理+Sqoop 安装+Sqoop 的简单使用案例+Sqoop 一些常用命令及参数
20
大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
21
大数据技术之_19_Spark学习_06_Spark 源码解析 + Spark 通信架构、脚本解析、standalone 模式启动、提交流程 + Spark Shuffle 过程 + Spark 内存
22
大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
23
大数据技术之_14_Oozie学习
24
大数据技术之_26_交通状态预测项目_01
25
大数据技术之_16_Scala学习_02_变量
26
大数据技术之_16_Scala学习_07_数据结构(上)-集合
27
大数据技术之_28_电商推荐系统项目_01
28
大数据技术之_28_电商推荐系统项目_02
29
大数据技术之_18_大数据离线平台_04_数据分析 + Hive 之 hourly 分析 + 常用 Maven 仓库地址
30
大数据技术之_16_Scala学习_01_Scala 语言概述
31
大数据技术之_29_MySQL 高級面试重点串讲_02
32
大数据技术之_18_大数据离线平台_05_离线平台项目模块小结
33
大数据技术之_19_Spark学习_06_Spark 源码解析小结
34
大数据技术之_16_Scala学习_05_面向对象编程-中级
35
大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配
36
大数据技术之_24_电影推荐系统项目_05_项目系统设计
37
大数据技术之_19_Spark学习_03_Spark SQL 应用解析小结
38
大数据技术之_19_Spark学习_07_Spark 性能调优小结
39
大数据技术之_19_Spark学习_05_Spark GraphX 应用解析小结
40
大数据技术之_19_Spark学习_02_Spark Core 应用解析小结
41
大数据技术之_24_电影推荐系统项目_08_项目总结及补充
42
大数据技术之_19_Spark学习_01_Spark 基础解析小结(无图片)
43
大数据技术之_18_大数据离线平台_03_数据处理+工具代码导入+业务 ETL 实现+创建数据库表
44
大数据技术之_24_电影推荐系统项目_02_Python 基础语法复习
45
大数据技术之_24_电影推荐系统项目_06_项目体系架构设计 + 工具环境搭建 + 创建项目并初始化业务数据 + 离线推荐服务建设 + 实时推荐服务建设 + 基于内容的推荐服务建设
46
大数据技术之_27_电商平台数据分析项目_01_大数据的框架回顾 + 大数据的企业应用
47
大数据技术之_23_Python核心基础学习_03_函数 + 对象(12.5小时)
48
大数据技术之_32_大数据面试题_01_Hive 基本面试 + Hive 数据分析面试 + Flume + Kafka 面试
49
大数据技术之_23_Python核心基础学习_04_ 异常 + 文件(3.5小时)
50
大数据技术之_16_Scala学习_03_运算符+程序流程控制
清单首页hadoop文章详情

大数据技术之_09_Hive学习_复习与总结

一、知识梳理

1.1、背景表结构

在讲解中我们需要贯串一个例子,所以需要设计一个情景,对应还要有一个表结构和填充数据。如下:有 3 个字段,分别为 personId 标识某一个人,company 标识一家公司名称,money 标识该公司每年盈利收入(单位:万元人民币)

建表并导入数据:

代码语言:javascript
复制
create table company_info(
  personId string, 
  company string,
  money float
)
row format delimited fields terminated by "\t";

load data local inpath '/opt/module/datas/company_info.txt' into table company_info;

1.1.1、order by

  hive 中的 order by 语句会对查询结果做一次全局排序,即,所有的 mapper 产生的结果都会交给一个 reducer 去处理,无论数据量大小,job 任务只会启动一个 reducer,如果数据量巨大,则会耗费大量的时间。 尖叫提示:如果在严格模式下,order by 需要指定 limit 数据条数,不然数据量巨大的情况下会造成崩溃无输出结果。涉及属性:set hive.mapred.mode=nonstrict/strict   例如:按照 money 排序的例子

代码语言:javascript
复制
select * from company_info order by money desc;

1.1.2、sort by

  hive 中的 sort by 语句会对每一块局部数据进行局部排序,即每一个 reducer 处理的数据都是有序的,但是不能保证全局有序。

1.1.3、distribute by

  hive 中的 distribute by 一般要和 sort by 一起使用,即将某一块数据归给(distribute by)某一个 reducer 处理,然后在指定的 reducer 中进行 sort by 排序。 尖叫提示:distribute by 必须写在 sort by 之前。 尖叫提示:涉及属性 mapreduce.job.reduces,hive.exec.reducers.bytes.per.reducer   例如:不同的人(personId)分为不同的组,每组按照 money 排序。

代码语言:javascript
复制
select * from company_info distribute by personId sort by personId asc, money desc;

1.1.4、cluster by

  hive 中的 cluster by 在 distribute by 和 sort by 排序字段一致的情况下是等价的。同时,cluster by 指定的列只能是降序,即默认的 descend,而不能是 ascend。   例如:写一个等价于 distribute by 与 sort by 的例子。

代码语言:javascript
复制
select * from company_info distribute by personId sort by personId desc;
等价于
select * from compnay_info cluster by personId;

1.2、行转列、列转行(UDAF 与 UDTF)

1.2.1、行转列

1、相关函数说明   1)CONCAT(string A/col, string B/col, …):返回输入字符串连接后的结果,支持任意个输入字符串。   2)CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的CONCAT()。第一个参数是剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间。   3)COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。 2、数据准备 person_info.txt

3、需求 把星座和血型一样的人归类到一起。结果如下:

代码语言:javascript
复制
射手座,A    大海|凤姐
白羊座,A    孙悟空|猪八戒
白羊座,B    宋宋

分析过程:

4、创建本地person_info.txt,导入数据

代码语言:javascript
复制
[atguigu@hadoop102 datas]$ vim person_info.txt
孙悟空    白羊座 A
大海    射手座 A
宋宋    白羊座 B
猪八戒    白羊座 A
凤姐    射手座 A

5、创建hive表并导入数据

代码语言:javascript
复制
create table person_info(
  name string, 
  constellation string, 
  blood_type string
) 
row format delimited fields terminated by "\t";

load data local inpath '/opt/module/datas/person_info.txt' into table person_info;

6、按需求查询数据

代码语言:javascript
复制
select concat_ws(",", constellation, blood_type) as c_b, name from person_info; t1

+--------+-------+--+
|  c_b   | name  |
+--------+-------+--+
| 白羊座,A  | 孙悟空   |
| 射手座,A  | 大海    |
| 白羊座,B  | 宋宋    |
| 白羊座,A  | 猪八戒   |
| 射手座,A  | 凤姐    |
+--------+-------+--+

--------------------

select 
  t1.c_b, collect_set(t1.name)
from 
  (select concat_ws(",", constellation, blood_type) as c_b, name from person_info) t1
group by
  t1.c_b;

+---------+----------------+--+
| t1.c_b  |      _c1       |
+---------+----------------+--+
| 射手座,A   | ["大海","凤姐"]    |
| 白羊座,A   | ["孙悟空","猪八戒"]  |
| 白羊座,B   | ["宋宋"]         |
+---------+----------------+--+

--------------------

select 
  t1.c_b, concat_ws("|", collect_set(t1.name)) name
from 
  (select concat_ws(",", constellation, blood_type) as c_b, name from person_info) t1
group by
  t1.c_b;

+---------+----------+--+
| t1.c_b  |   name   |
+---------+----------+--+
| 射手座,A   | 大海|凤姐    |
| 白羊座,A   | 孙悟空|猪八戒  |
| 白羊座,B   | 宋宋       |
+---------+----------+--+

1.2.2、列转行

1、函数说明   EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。   LATERAL VIEW     用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias     解释:lateral view 用于和split,explode等UDTF函数一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。 2、数据准备 movie_info.txt

代码语言:javascript
复制
movie           category

《疑犯追踪》    悬疑,动作,科幻,剧情
《Lie to me》   悬疑,警匪,动作,心理,剧情
《战狼2》   战争,动作,灾难

3、需求 将电影分类中的数组数据展开。结果如下:

代码语言:javascript
复制
《疑犯追踪》    悬疑
《疑犯追踪》    动作
《疑犯追踪》    科幻
《疑犯追踪》    剧情
《Lie to me》   悬疑
《Lie to me》   警匪
《Lie to me》   动作
《Lie to me》   心理
《Lie to me》   剧情
《战狼2》   战争
《战狼2》   动作
《战狼2》   灾难

4、创建本地movie.txt,导入数据

代码语言:javascript
复制
[atguigu@hadoop102 datas]$ vim movie_info.txt
《疑犯追踪》    悬疑,动作,科幻,剧情
《Lie to me》   悬疑,警匪,动作,心理,剧情
《战狼2》   战争,动作,灾难

5、创建hive表并导入数据

代码语言:javascript
复制
create table movie_info(
  movie string, 
  category array<string>
) 
row format delimited fields terminated by "\t" -- 表中字段与字段之间的分割符是\t
collection items terminated by ","; -- 集合字段中的每个元素之间的分隔符是逗号

load data local inpath "/opt/module/datas/movie_info.txt" into table movie_info;

6、按需求查询数据

代码语言:javascript
复制
select 
  movie
  explode(category)
from
  movie_info;

上面是错误的。假设能执行的话,得到的是笛卡尔积。

小结:像split,explode等UDTF函数,是不能跟原表的字段直接进行查询的,UDTF函数一定要和lateral view联合在一块用。
-----------------------------------------

select
  movie,
  category_name
from 
  movie_info lateral view explode(category) table_tmp as category_name; -- lateral view 对原始表的集合字段进行了侧写,得到侧写表和侧写列(侧写字段)。

1.3、建表时的数组操作

  fields terminated by:标识一张表中字段与字段之间的分隔符。   collection items terminated by:标识一个字段(数组字段)中各个子元素(item)的分隔符。注意:若有两个或两个以上的数组字段,那么他们的分隔符都得一样。

1.4、orc 存储

  orc 即 Optimized Row Columnar (ORC) file,在 RCFile 的基础上演化而来,可以提供一种高效的方法在 Hive 中存储数据,提升了读、写、处理数据的效率。

1.5、Hive 分桶

为什么要用Hive 分桶? 答:分区会产生新的文件和目录,在HDFS系统上NameNOde的压力会增大。 Hive 可以将表或者表的分区进一步组织成桶,以达到:   1、数据取样效率更高   2、数据处理效率更高   桶通过对指定列进行哈希来实现,将一个列名下的数据切分为“一组桶”,每个桶都对应了一个该列名下的一个存储文件。

1.5.1、直接分桶

  开始操作之前,需要将 hive.enforce.bucketing 属性设置为 true,以标识 Hive 可以识别桶。

代码语言:javascript
复制
create table music(
  id int,
  name string, 
  size float
)
row format delimited fields terminated by "\t"
clustered by (id) into 4 buckets;

该代码的意思是将 music 表按照 id 将数据分成了 4 个桶,插入数据时,会对应 4 个 reduce 操作,输出 4 个文件。 分桶算法:id.hashCode % 4(桶数) Map集合key去重的原理和set集合去重原理:先比较哈希值(本质是比较地址值,hashCode()),再比较所对应的具体值(equals())。 set集合存储数据的本质是使用Map集合来存储的。 Map集合存储数据的本质是使用数组来存储的。 数组存储数据的本质是使用索引+值来存储的。

1.5.2、在分区中分桶

  当数据量过大,需要庞大分区数量时,可以考虑桶,因为分区数量太大的情况可能会导致文件系统(HDFS)挂掉,而且桶比分区有更高的查询效率。数据最终落在哪一个桶里,取决于 clustered by 的那个列的值的 hash 数与桶的个数求余来决定。虽然有一定离散性,但不能保证每个桶中的数据量是一样的。

代码语言:javascript
复制
create table music2(
  id int,
  name string, 
  size float
)
partitioned by(date string)
clustered by(id) sorted by(size) into 4 bucket 
row format delimited fields terminated by "\t";

load data local inpath '/opt/module/datas/music2.txt' into table music2 partition(date='2017-08-30');

二、总结

2.1 启动/停止hadoop集群、zookeeper集群、历史服务器

代码语言:javascript
复制
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh -- 启动dfs集群
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh -- 启动yarn集群
[atguigu@hadoop102 ~]$ zkstart.sh -- 启动zookeeper集群
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver -- 启动历史服务器

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/stop-dfs.sh -- 停止dfs集群
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/stop-yarn.sh -- 停止yarn集群
[atguigu@hadoop102 ~]$ zkstop.sh -- 停止zookeeper集群
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver -- 停止历史服务器

2.2 访问hive的两种方式

代码语言:javascript
复制
方式一:
[atguigu@hadoop102 hive]$ bin/hive -- 启动hive

方式二:
[atguigu@hadoop102 hive]$ bin/hiveserver2
[atguigu@hadoop102 hive]$ bin/beeline(在新的窗口中输入)
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop102:10000(回车)
Connecting to jdbc:hive2://hadoop102:10000
Enter username for jdbc:hive2://hadoop102:10000: atguigu(回车)
Enter password for jdbc:hive2://hadoop102:10000: (直接回车)
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop102:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| hive_db2       |
+----------------+--+

2.3 CentOS6x与Cenos7x命令的区别

代码语言:javascript
复制
CentOS6x
[atguigu@hadoop102 ~]$ sudo service mysqld restart

CentOS7x
[atguigu@hadoop102 ~]$ sudo systemctl restart mysqld.service

2.4 大数据开发中重用的两种数据格式

  xxx.tsv 文件中的字段是以\t来分割的。   xxx.csv 文件中的字段是以逗号(,)来分割的。(comma:逗号)

2.5 UDF、UDAF、UDTF

  collect_set(clo) 将多行数据聚合成一列数据,UDAF函数   concat_ws(separator, str1, str2,…) 聚合函数,UDAF函数   split((col),explode(col) 将一列数据拆成多行数据,UDTF函数

2.6 小知识总结

分桶算法:id.hashCode % 4(桶数) Map集合key去重的原理和set集合去重原理:先比较哈希值(本质是比较地址值,hashCode()),再比较所对应的具体值(equals())。   set集合存储数据的本质是使用Map集合来存储的。   Map集合存储数据的本质是使用数组来存储的。   数组存储数据的本质是使用索引+值来存储的。

下一篇
举报
领券