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

一、知识梳理1.1、背景表结构1.1.1、order by1.1.2、sort by1.1.3、distribute by1.1.4、cluster by1.2、行转列、列转行(UDAF 与 UDTF)1.2.1、行转列1.2.2、列转行1.3、建表时的数组操作1.4、orc 存储1.5、Hive 分桶1.5.1、直接分桶1.5.2、在分区中分桶二、总结2.1 启动/停止hadoop集群、zookeeper集群、历史服务器2.2 访问hive的两种方式2.3 CentOS6x与Cenos7x命令的区别2.4 大数据开发中重用的两种数据格式2.5 UDF、UDAF、UDTF2.6 小知识总结


一、知识梳理

1.1、背景表结构

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


建表并导入数据:

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 排序的例子

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 排序。

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 的例子。

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、需求
把星座和血型一样的人归类到一起。结果如下:

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

分析过程:


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

[atguigu@hadoop102 datas]$ vim person_info.txt孙悟空    白羊座 A大海    射手座 A宋宋    白羊座 B猪八戒    白羊座 A凤姐    射手座 A

5、创建hive表并导入数据

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、按需求查询数据

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) t1group by  t1.c_b;

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

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

select   t1.c_b, concat_ws("|", collect_set(t1.name)) namefrom   (select concat_ws(",", constellation, blood_type) as c_b, name from person_info) t1group 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

movie           category

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

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

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

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

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

5、创建hive表并导入数据

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

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

6、按需求查询数据

select   movie  explode(category)from  movie_info;

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

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

select  movie,  category_namefrom   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 可以识别桶。

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 数与桶的个数求余来决定。虽然有一定离散性,但不能保证每个桶中的数据量是一样的。

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集群、历史服务器

[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的两种方式

方式一:[atguigu@hadoop102 hive]$ bin/hive -- 启动hive

方式二:[atguigu@hadoop102 hive]$ bin/hiveserver2[atguigu@hadoop102 hive]$ bin/beeline(在新的窗口中输入)Beeline version 1.2.1 by Apache Hivebeeline> !connect jdbc:hive2://hadoop102:10000(回车)Connecting to jdbc:hive2://hadoop102:10000Enter 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_READ0: jdbc:hive2://hadoop102:10000> show databases;+----------------+--+| database_name  |+----------------+--+| default        || hive_db2       |+----------------+--+

2.3 CentOS6x与Cenos7x命令的区别

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集合存储数据的本质是使用数组来存储的。
  数组存储数据的本质是使用索引+值来存储的。

原文地址:https://www.cnblogs.com/chenmingjun/p/10463713.html

时间: 2024-10-11 22:55:27

大数据技术之_09_Hive学习_复习与总结的相关文章

大数据技术之_16_Scala学习_11_客户信息管理系统+并发编程模型 Akka+Akka 网络编程-小黄鸡客服案例+Akka 网络编程-Spark Master Worker 进程通讯项目

第十五章 客户信息管理系统15.1 项目的开发流程15.2 项目的需求分析15.3 项目的界面15.4 项目的设计-程序框架图15.5 项目的功能实现15.5.1 完成 Customer 类15.5.2 完成显示主菜单和退出软件功能15.5.3 完成显示客户列表的功能15.5.4 完成添加客户的功能15.5.5 完成删除客户的功能15.5.6 完善退出确认功能15.5.7 完善删除确认功能15.5.8 完成修改客户的功能第十六章 并发编程模型 Akka16.1 Akka 的介绍16.2 Acto

大数据技术之_08_Hive学习_01_Hive入门+Hive安装、配置和使用+Hive数据类型

第1章 Hive入门1.1 什么是Hive1.2 Hive的优缺点1.2.1 优点1.2.2 缺点1.3 Hive架构原理1.4 Hive和数据库比较1.4.1 查询语言1.4.2 数据存储位置1.4.3 数据更新1.4.4 索引1.4.5 执行1.4.6 执行延迟1.4.7 可扩展性1.4.8 数据规模第2章 Hive安装.配置和使用2.1 Hive安装地址2.2 Hive安装部署2.3 将本地文件导入Hive案例2.4 MySql安装2.4.1 安装包准备2.4.2 安装MySql服务器2.

大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配

第十一章 数据结构(下)-集合操作11.1 集合元素的映射-map11.1.1 map 映射函数的操作11.1.2 高阶函数基本使用案例1+案例211.1.3 使用 map 映射函数来解决11.1.4 模拟实现 map 映射函数的机制11.1.5 课堂练习11.2 集合元素的扁平-flatMap11.3 集合元素的过滤-filter11.4 集合元素的化简-reduce11.5 集合元素的折叠-fold11.6 集合元素的扫描-scan11.7 集合的综合应用案例11.8 集合的合并-zip11

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->

大数据技术之_03_Hadoop学习_02_入门_Hadoop运行模式+【本地运行模式+伪分布式运行模式+完全分布式运行模式(开发重点)】+Hadoop编译源码(面试重点)+常见错误及解决方案

第4章 Hadoop运行模式4.1 本地运行模式4.1.1 官方Grep案例4.1.2 官方WordCount案例4.2 伪分布式运行模式4.2.1 启动HDFS并运行MapReduce程序4.2.2 启动YARN并运行MapReduce程序4.2.3 配置历史服务器4.2.4 配置日志的聚集4.2.5 配置文件说明4.3 完全分布式运行模式(开发重点)4.3.1 虚拟机准备4.3.2 编写集群分发脚本xsync4.3.3 集群配置4.3.4 集群单点启动4.3.5 SSH无密登录配置4.3.6

大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Core 实例练习

第1章 RDD 概念1.1 RDD 为什么会产生1.2 RDD 概述1.2.1 什么是 RDD1.2.2 RDD 的属性1.3 RDD 弹性1.4 RDD 特点1.4.1 分区1.4.2 只读1.4.3 依赖1.4.4 缓存1.4.5 CheckPoint第2章 RDD 编程2.1 RDD 编程模型2.2 RDD 创建2.2.1 由一个已经存在的 Scala 集合创建,即集合并行化(测试用)2.2.2 由外部存储系统的数据集创建(开发用)2.3 RDD 编程2.3.1 Transformatio

大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩编码8.2.2 压缩参数配置8.3 开启Map输出阶段压缩8.4 开启Reduce输出阶段压缩8.5 文件存储格式8.5.1 列式存储和行式存储8.5.2 TextFile格式8.5.3 Orc格式8.5.4 Parquet格式8.5.5 主流文件存储格式对比实验8.6 存储和压缩结合8.6.1 修

大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式2.1.2 GraphX 存储模式2.2 vertices.edges 以及 triplets2.2.1 vertices2.2.2 edges2.2.3 triplets2.3 图的构建2.3.1 构建图的方法2.3.2 构建图的过程2.4 计算模式2.4.1 BSP 计算模式2.4.2 图操作一

大数据技术之_30_JVM学习_01_JVM 位置+JVM 体系结构概览+堆体系结构概述+堆参数调优入门+JVM 的配置和优化+Tomcat 的配置和优化

1.JVM 位置2.JVM 体系结构概览3.堆体系结构概述4.堆参数调优入门5.JVM 的配置和优化6.Tomcat 的配置和优化 熟悉 JVM 架构与 GC 垃圾回收机制以及相应的 JVM 调优,有过在 Linux 系统下的调优经验. 淘宝的周志明<深入理解 Java 虚拟机>中说 JVM 的优化,其中 99% 优化的是堆,1% 优化的是方法区. 内地女歌手照片--李嘉欣,贴在桌面上. 1.JVM 位置 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 2.JVM 体系结构概览 详解如