IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 深入理解Hive -> 正文阅读

[大数据]深入理解Hive

1. 数据库和数据仓库的区别

  • 数据库:
    真正存储和管理数据的,对数据有直接的处置权
    关心的事情是 在线事务过程(OLTP)
  • 数据仓库:
    可以利用一个或多个数据库的数据,进行数据分析。
    关心的事情是 在线分析过程(OLAP)

2. hive运行原理

写sql语句,hive内部自动转成MapReduce程序执行。
原数据在hdfs上,sql语句需要使用表。
表是以目录形式存在hdfs的某个指定位置(warehouse)
可以通过数据加载的形式,把hdfs或本地的原数据加载到表(目录)中
表里的数据实际上是存放在这个目录下的文件

3. hive数据存储

3.1. 真实数据

  1. hive-site.xml中设置的数据仓库的位置就是hive在hdfs的根目录
  2. 数据仓库的路径(warehouse)同时也是default默认数据库的位置
  3. 新建的数据库在warehouse的路径下以 xxx.db 目录形式存在
  4. 不管是默认数据库还是新建数据库,数据都是在相应的数据库的目录下
    以文件形式存在

3.2. 元数据

  1. 初始化的时候会在mysql创建一个元数据库
  2. 在元数据下有很多表,包括数据库,表,字段,位置,格式化等信息
  3. hive是通过元数据找到真实数据,如果元数据被篡改或删除,
    即使真实数据存在,也无法使用

3.3. 执行过程

hive的执行顺序,先去mysql中找元数据,通过元数据找hdfs的真实数据

4. 分区和分桶

4.1. 分区

4.1.1. 什么是分区?
  • 在表中的数据以目录级别进行划分
    有独立的与原表字段之外的单独字段,使用的时候与原表字段没有区别
  • 分区表的优势
  1. 提高查找效率
  2. 减少字段的存储
4.1.2. 分区表的使用

在这里插入图片描述
在这里插入图片描述
select * from xxx where 分区字段=xxx

  • 单分区
    只有一个分区字段,就是单分区。
  • 多分区
    如果有多个字段同时作为分区条件,就是多分区
    多分区使用多层目录表示

4.2. 分桶

4.2.1. 分桶和分区的区别
分区:在hdfs上按照目录级别进行划分
分桶:在hdfs上按照文件级别进行划分
4.2.2. 分桶的使用
  1. 创建普通表,普通表里有数据
  2. 创建分桶表,定义分桶字段
  3. 将普通表的数据导入到分桶表中,可以进行分桶。
4.2.3. 分桶的原理

分桶本质上是MapReduce的分区,可以发现,在执行分桶操作的时候,reduce的数量就是等于桶的数量,默认以哈希值来分桶的。从某种意义上,可以把分桶就理解为MapReduce的分区。

4.2.4. 查询的时候分桶显示

与上面的分桶表已经没有关系了,任何表都可以使用以下语句查询

  • a.按照某个字段分y桶,取第x桶数据
    select * from tablesample (bucket x out of y on 字段)
  • b.完全随机抽取数据
    select * from tablesample (bucket x out of y on rand())

5. 内部表和外部表

  • 内部表和外部表
    内部表:hive默认生成的表类型是管理表,也叫做内部表。
    特点:删除表的时候,元数据和真实数据全部删除,比较危险。
  • 外部表:create external table …
    特点:删除表的时候,只删除表结构(元数据)
    不删除表中的数据(hdfs上的真实数据)
    再创建同名表的时候可以直接做数据的恢复

6. 排序(4个by)

  1. order by
    select * from xxxx order by 字段 [desc]
    reduceTask数量为1的全排序
    与设定的reduce数量无关,不管设置多少,都按reduceTask=1执行
    可以使用 order by field1 [desc],field2 [desc],… 进行二次排序
  2. sort by
    只能针对把每个reduce中的数据进行排序,影响不了分组。
    是MapReduce里的部分排序
    每个文件有序,但是全局无序
    结果写入文件,会生成与reduceTask数量一致个文件
    结果直接输出到控制台,按照生成文件的数据顺序依次显示
    可以使用 sort by field1 [desc],field2 [desc],… 进行二次排序
  3. distribute by
    执行完查询操作之后的结果数据按某个字段的hashCode值分区,但是不排序
    最终结果的分区数量要小于等于reduce的数量,或者为1
    如果想排序,加 sort by 字段(可以为分区字段,也可以为非分区字段)
    order by 以reduce数量为1执行,与distribute by分区相违背,不能使用
  4. cluster by
    cluster by = distribute by + sort by
    对同一个字段既分区又排序,可以直接使用cluster by,可以保证一个字段即分区,又全排序

7. 开窗函数

通过over函数 确定窗口数据。
区别:普通聚合函数最终只能返回一个数据,开窗聚合可以每条数据都返回。

8. 自定义函数

  1. UDF: 用户自定义普通函数
  2. UDAF: 用户自定义聚合函数(多进一出)
  3. UDTF: 用户自定义表生成函数(一进多出)

9. Hive优化

  1. 合理设置Map数量
  2. 合理设置reduce数量
  3. 尽量使用本地模式运行,本地模式运行的速度比分布式模式快很多
  4. 表连接的时候小表在左。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:48:52  更:2021-08-16 11:50:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:27:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码