首页 > 其他分享 >hive基础知识分享(一)

hive基础知识分享(一)

时间:2024-11-06 16:24:14浏览次数:1  
标签:HDFS 存储 students 分区 Hive 基础知识 hive 分享 数据

写在前面

今天来学习hive部分的知识。

Hive 相关概念

Hive是什么?

Apache Hive 是一个基于 Hadoop 的数据仓库工具,旨在通过 SQL 类似的查询语言(称为 HiveQL)来实现对存储在 HDFS(Hadoop Distributed File System)中的大规模数据的查询、分析和管理。它为数据分析提供了一种高层次的抽象,使得用户能够使用熟悉的 SQL 语法对数据进行操作。Hive 是 SQL 解析引擎,它将 SQL 语句转译成 MapReduce 任务并在 Hadoop 上执行,用户无需深入了解底层的 MapReduce 计算模型。Hive 的表实际上就是 HDFS 的目录,按表名把文件夹分开;如果是分区表,则分区值是子文件夹,可以直接在 MapReduce 任务中使用这些数据。

Hive的架构

  1. 元数据:包括表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。默认存储在自带的 Derby 数据库中,推荐使用 MySQL 存储 Metastore。
  2. 数据存储:数据使用 HDFS 进行存储,计算则通过 MapReduce、Spark 或 Tez 实现。
  3. 驱动器
    • 解析器(SQL Parser):将 SQL 字符串转换为抽象语法树(AST),这一步通常通过第三方工具库完成(如 Antlr),并对 AST 进行语法分析。
    • 编译器(Physical Plan):将 AST 编译成逻辑执行计划。
    • 优化器(Query Optimizer):对逻辑执行计划进行优化。
    • 执行器(Execution):将逻辑执行计划转换为物理执行计划,通常在 Hive 中就是 MapReduce 或 Spark 任务。

Hive与MySQL的区别

  1. 查询语言:Hive 使用类 SQL 查询语言 HQL,熟悉 SQL 的开发者可以轻松上手。
  2. 数据存储位置:Hive 的数据存储在 HDFS 中,而 MySQL 的数据存储在本地文件系统或块设备中。
  3. 数据格式:Hive 没有专门的数据格式,数据以文本形式存储;MySQL 数据有严格的格式化和结构化存储。
  4. 数据更新:Hive 在 0.14 版本后支持更新操作,但整体较弱;MySQL 支持频繁的增删改操作。
  5. 索引:Hive 不会对数据进行索引处理,访问延迟较高;MySQL 支持索引,查询速度较快。
  6. 执行计算:Hive 使用 MapReduce 执行计算,而 MySQL 使用自有的执行引擎。
  7. 数据规模:Hive 可以处理更大规模的数据,因为它建立在 Hadoop 集群之上并支持并行计算;MySQL 更适合处理小规模数据。

Hive常用的存储格式,优缺点,使用场景

  • TEXTFILE

    • 优点:易于读取和查看,支持多种分隔符。
    • 缺点:无压缩,存储空间大,性能差。
    • 使用场景:主要用于与其他系统的数据交互,通常不推荐用于事实表和维度表。
  • ORCFILE

    • 优点:列式存储,支持高压缩比,查询性能好,支持 MapReduce 并行处理。
    • 缺点:读写时需要额外的 CPU 资源进行压缩和解压缩。
    • 使用场景:适合存储大规模数据的事实表,能有效节省存储和计算资源。
  • PARQUET

    • 优点:支持复杂数据类型(如数组、结构体),适合嵌套数据结构,列式存储。
    • 缺点:压缩比可能不如 ORC 高。
    • 使用场景:适用于存储需要处理复杂嵌套数据的场景。

行式存储与列式存储的区别

  • 行式存储 (Row-oriented Storage)

    • 存储方式:将一整行的数据存储在一起。
    • 适用场景:OLTP(联机事务处理),如交易系统。
    • 优点:快速读取单行数据,适合频繁的插入、更新和删除操作。
    • 缺点:进行分析查询时,读取整行数据可能导致性能下降。
  • 列式存储 (Column-oriented Storage)

    • 存储方式:将每一列的数据存储在一起。
    • 适用场景:OLAP(联机分析处理),如数据仓库、大数据分析。
    • 优点:适合大规模数据分析和聚合查询,能够更好的压缩数据。
    • 缺点:对于单行的读写操作性能较差。

Hive常用的数据类型

image-20241008093142723

  • 基本类型INT, BIGINT, FLOAT, DOUBLE, STRING, DATE, TIMESTAMP
  • 复杂类型
    • ARRAY:数组类型。
    • MAP:键值对类型。
    • STRUCT:命名字段集合类型。
    • UNION:选择一种数据类型进行存储,值必须完全匹配。

内部表vs外部表

  1. 内部表

    • 数据存储在默认路径 /user/hive/warehouse/ 下。
    • 删除表时,会删除表的数据。
    • 适合数据完全由 Hive 管理的场景。
  2. 外部表

    • 数据存储路径可以自定义。
    • 删除表时,仅删除表的元数据,数据依然存在。
    • 适合需要与其他系统共享数据,或数据长期保留的场景。

分区 vs 分桶

  • 分区:按某列的值将数据物理分隔,常见于日期、区域等字段。适合减少数据扫描量,提升查询效率。
  • 分桶:将数据均匀分配到固定数量的桶中。适合优化连接和聚合操作,尤其是在连接条件包含分桶列时,可以减少数据的移动量。

Hive建表时需要考虑的因素

  1. 分区与分桶:根据业务需求,分区通常按业务日期进行,分桶用于优化查询性能。
  2. 外部表:建议使用外部表,避免因误删而丢失数据。
  3. 存储格式与压缩:选择合适的存储格式(如 ORC、Parquet)和压缩格式(如 Snappy、Gzip)。
  4. 命名规范:表和列名要规范,避免使用保留字或难以理解的命名。
  5. 数据分层:根据业务逻辑分层管理数据,避免表设计过于复杂。

Hive 数据加载与动态分区

Hive 如何加载数据

1. 使用 LOAD DATA 命令

  • 从 HDFS 导入数据

    LOAD DATA INPATH '/test/' INTO TABLE students_from_hdfs;
    
    • 路径可以是目录,Hive 会将该目录下的所有文件导入表中,文件格式必须与表定义时指定的存储格式一致。
    • 从 HDFS 加载的数据会被移动到该表的存储目录下。
  • 从本地文件系统导入

    LOAD DATA LOCAL INPATH '/test/' INTO TABLE students_from_local;
    
    • 文件会上传至表对应的目录。
    • 本地数据会保留,不会删除。

2. 表对表加载

  • 创建新表并将数据插入

    CREATE TABLE IF NOT EXISTS students_select AS SELECT * FROM students;
    
  • 插入数据到现有表

    INSERT [OVERWRITE] INTO TABLE students_ins SELECT * FROM students;
    
    • 使用 INSERT OVERWRITE 会覆盖目标表中的数据。

3. 手动上传数据

  • 通过 HDFS 命令上传数据
    hdfs dfs -put /data/ /user/hive/warehouse/students/
    
    • 在 Hive 命令行中也可以使用 -put 上传数据到 HDFS。

Hive 中什么是动态分区?

在使用动态分区插入数据时,Hive 会根据插入语句中指定的分区字段的值来创建分区。这意味着,如果插入数据时某个分区字段的值在现有的分区中不存在,Hive 会自动创建该分区。

设置动态分区参数

在执行动态分区插入之前,需要设置以下参数:

SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;  -- 允许创建新分区

示例:

  1. 创建带有分区的表

    CREATE TABLE students (
      name STRING,
      age INT
    )
    PARTITIONED BY (year INT, month INT);
    
  2. 插入数据并自动创建分区

    INSERT INTO TABLE students PARTITION (year, month)
    SELECT name, age, 2024, 10 FROM temp_students;
    
    • 如果 year=2024month=10 的分区不存在,Hive 会自动创建该分区。

通过使用动态分区,Hive 能够更加灵活地管理分区数据,减少手动管理分区的复杂性。

标签:HDFS,存储,students,分区,Hive,基础知识,hive,分享,数据
From: https://www.cnblogs.com/cjybigdatablog/p/18530385

相关文章

  • 实践中如何优化 MySQL:深入剖析与策略分享
    MySQL作为一款广泛应用的关系型数据库管理系统,在企业级应用和互联网服务中扮演着重要的角色。然而,随着业务规模的增长和数据量的增加,如何有效地优化MySQL性能,确保系统在高并发、大数据量的环境下仍能高效运行,成为开发者和数据库管理员的重要课题。本文将深入探讨MySQL......
  • 十年码农的编程心得分享
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • Qt入门基础分享
    文章目录学习Qt语言之前的基本知识1.编程基础语法:面向对象编程(OOP):基本数据结构:了解数组、链表、栈、队列、树(如二叉树、平衡树)、图(如邻接矩阵、邻接表)等。算法:熟悉常见的排序算法(如快速排序、归并排序、冒泡排序)和查找算法(如线性查找、二分查找)。复杂度......
  • w021基于Springboot的校园周边美食探索及分享平台的设计与实现
    ......
  • 没想到我的化妆心得这么火 | 复古烟熏妆教程再分享
    上次分享了我的化妆心得后,真的没想到会引起如此大的共鸣。看到大家的热情回应和鼓励,我内心充满了温暖和感动。这也让我更加坚定了继续分享的决心。复古烟熏妆之所以能引发这么多人的关注,我想是因为它独特的魅力。这种妆容风格既有着复古的韵味,又能展现出现代的时尚感。它可......
  • 黑马程序员JavaWeb开发教程(后端部分---原理篇) ---笔记分享
    目录SpingBoot原理配置优先级Bean管理获取BeanBean作用域第三方BeanSpringBoot原理起步依赖自动配置自动配置原理原理分析要搞清楚SpringBoot的自动配置原理,要从SpringBoot启动类上使用的核心注解@SpringBootApplication开始分析:@SpringBootConfiguration注解上使......
  • 大规模语言模型的书籍分享!!
    在当今人工智能领域,大规模语言模型成为了研究和应用的热点之一。它们以其大规模的参数和强大的性能表现,推动着机器学习和深度学习技术的发展。对于GPT系列大规模语言模型的发展历程,有两点令人印象深刻。前排提示,文末有大模型AGI-CSDN独家资料包哦!第一点是可拓展的训练架......
  • 计算机组成原理基础知识(二)
    来源:https://blog.csdn.net/weixin_47180815/article/details/125496560?fromshare=blogdetail&sharetype=blogdetail&sharerId=125496560&sharerefer=PC&sharesource=rxzyyyyyy&sharefrom=from_linkn位定点小数、整数的取值范围溢出判断1、采用一位符号位2、采用双符......
  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对校园疫情大学生防控出入系统等问题,对校园疫情大学生防控出入系统进行研究分析,然后开发设计......
  • 骨传导耳机哪个牌子好?五款口碑炸裂的骨传导耳机实力分享!
    骨传导耳机以其独特的传输方式和开放式的聆听体验逐渐成为了运动爱好者的新宠。不同于传统的入耳式耳机,骨传导耳机通过颞骨传递声音,不仅保护了耳朵,还能让用户在享受音乐的同时保持对外界环境的警觉,大大提高了安全性和舒适度。然而,面对市场上琳琅满目的骨传导耳机品牌和型号,如何......