Day1 - Hive基础知识

Hive

简介

概述

  1. Hive是由Facobook开发的后来贡献给了Apache的一套用于进行数据仓库管理的工具,使用类SQL语言来对分布式文件系统中的PB级别的数据来进行读写、管理以及分析
  2. Hive基于Hadoop来使用的,底层的默认计算引擎使用的是MapReduce。Hive利用类SQL(HQL,Hive Query Language)语言来操作数据,但是底层是将SQL转化为MapReduce来执行(效率低下),也因此,Hive更适合于处理离线分析场景
  3. Hive可以屏蔽掉不同语言之间的差异性,降低了大数据的入门门槛
  4. Hive的支持的计算引擎:MapReduce、Tez、Spark。底层默认使用的是MapReduce,但是效率最高的是Spark
  5. 在Hive中,库名、表名、字段名、字段类型、分区、分桶等信息属于元数据,是存储在数据库中,默认支持的是Derby。但是Derby本身是一个单连接的数据库(只允许一个客户端),所以会将Hive的元数据库替换为MySQL。注意:Hive的元数据是存储在数据库的,Hive的数据是放在HDFS上!

版本

  1. 到目前为止,Hive一共有4个版本:Hive1.X和Hive4.X
  2. Hive4.X一共有3个小版本(alpha1、alpha2、beta1),目前都是测试版
  3. 目前,在市面上,Hive1.x到Hive3.x都在使用,其中Hive1.x逐渐被抛弃,现在市面上使用较多的是Hive2.x和Hive3.x
  4. Hive3.x需要基于Hadoop3.x使用,Hive2.x需要基于Hadoop2.x使用

基本语法

注意问题

  1. Hive中,如果不指定,默认只有一个库default
  2. 在Hive中,每一个database对应了HDFS上的一个目录。默认情况下,database是放在HDFS的/user/hive/warehouse
  3. 在Hive中,没有主键的概念,也不支持主键
  4. Hive中的每一个表也对应了HDFS上的一个目录
  5. Hive中建表的时候需要指定字段之间的间隔符号,表一旦建好,字段之间的间隔符号就不能变化!
  6. Hive的数据默认支持insert和select,默认不支持delete和update。如果需要支持delete和update操作,那么在建表的时候,需要指定Hive数据在HDFS上的文件存储类型必须是orcparquet格式

库操作

  1. 查看所有的库

    sql 复制代码
    show databases;
  2. 建库

    sql 复制代码
    create database demo;
  3. 删除库。要求库必须是空的

    sql 复制代码
    drop database demo;
  4. 建库的时候指定库的存储位置

    sql 复制代码
    create database demo location '/demo.db';
  5. 利用正则表达式过滤符合要求的库

    sql 复制代码
    show databases like 'd*';
  6. 建库的时候,判断库是否存在。如果不存在,那么建库

    sql 复制代码
    create database if not exists demo;
  7. 强制删除库

    sql 复制代码
    drop database demo cascade;
  8. 使用库

    sql 复制代码
    use demo;
  9. 建库的时候还给库指定属性

    sql 复制代码
    create database demo2 with dbproperties('create_time'='2024-03-26');
  10. 描述库

    sql 复制代码
    desc database demo2;
  11. 描述库的详细信息

    sql 复制代码
    desc database extended demo2;
  12. 修改库的属性

    sql 复制代码
    alter database demo2 set dbproperties('create_time'='024-03-27');

表及数据操作

  1. 创建表

    sql 复制代码
    create table person ( id int, name string, age int);
  2. 插入数据

    sql 复制代码
    insert into table person values(1, 'Amy', 15);

    转化为MapReduce执行

  3. 查询数据

    sql 复制代码
    select * from person;
  4. 加载数据 - 实际上就是将文件上传到HDFS上,加载速度和文件的上传速度相关

    sql 复制代码
    load data local inpath '/opt/hive_data/person' into table person;
    -- load data 加载数据
    -- local 本地
    -- inpath 输入路径
  5. 删除表

    sql 复制代码
    drop table person;
  6. 建立person表,指定字段之间的间隔符号是空格

    sql 复制代码
    create table person ( id int, name string, age int) row format delimited fields terminated by ' '; 
    -- row format 对数据进行按行的处理
    -- delimited 对什么数据进行拆分
    -- fields 字段、属性
    -- terminated by ' ' 用什么拆分
  7. 查看所有的表

    sql 复制代码
    show tables;
  8. 描述表

    sql 复制代码
    desc person
  9. 创建p2表,p2的表结构和person一样

    sql 复制代码
    create table p2 like person;
  10. 如果p3表不存在,那么创建p3表,表结构和person一样

    sql 复制代码
    create table if not exists p3 like person;
  11. 创建p4表,表结构以及数据都和person一样(复制person表)

    sql 复制代码
    -- 将person的数据全部查询出来,根据查询数据的结构来建立p4表并放入数据
    create table p4 as select * from person;
    select * from p4;
  12. 将person表中age>=18的数据查询出来,放入p2表中

    sql 复制代码
    insert into table p2 select * from person where age >= 18;

    注意insert into表示向表中追加数据,insert overwrite先将表中的数据清空掉,然后再覆盖写入

  13. 从person表中查询数据,将id<5的数据覆盖到p2表中,将age<18的数据写入到p3表中

    sql 复制代码
    from person
     insert overwrite table p2 select * where id < 5
     insert into table p3 select * where age < 18;
  14. 将person表中id>5的数据查询出来放到HDFS的/person目录下,字段之间用,间隔

    sql 复制代码
    insert overwrite directory '/person' row format delimited fields terminated by ',' select * from person where id > 5;

    如果是将数据写到Hive之外的地方,此时只能使用insert overwrite,所以要求输出路径必须为空。如果输出路径不为空,那么会将输出路径下的所有文件给清空!!!

  15. Hive除了支持将结果写到HDFS上,还支持写到本地磁盘上

    sql 复制代码
    insert overwrite local directory '/opt/hive_demo' row format delimited fields terminated by '\t' select * from person where age >= 18;

    同样,要求输出路径必须为空!!!

  16. 将person表重命名为p1

    sql 复制代码
    alter table person rename to p1;
  17. 将p1表的id字段改为pid,类型改为string

    sql 复制代码
    alter table p1 change column id pid string;
  18. 在p1表中新增字段:gender,类型是string

    sql 复制代码
    alter table p1 add columns(gender string);

表结构

内部表和外部表

  1. 在Hive中,所有的表分为内部表(又叫管理表,Managed Table )和外部表(External Table)

  2. 一般而言,在Hive中,手动建表手动添加数据的表,大部分是内部表;在Hive中,建表管理HDFS上已经存在的数据,这个表称之为外部表

  3. 可以通过

    sql 复制代码
    desc extended p1;
    -- 或者
    desc formatted p1;

    如果是内部表,那么tableType的值MANAGED_TABLE;如果是外部表,那么tableType的值EXTERNAL_TABLE

  4. 建立外部表

    sql 复制代码
    create external table flows (
        phone string,
        city string,
        name string,
        upFlow int,
        downFlow int
    ) row format delimited fields terminated by ' '
     location '/flow';
  5. 查询数据

    sql 复制代码
    -- tablesample,抽样函数
    select * from flows tablesample(5 rows);
  6. 删除内部表,那么对应的元数据和HDFS上的目录都会删除;删除外部表,那么只删除元数据但是不删除HDFS上的目录

  7. 在实际过程中,项目前期使用外部表,中后期使用内部表

  8. 内部表转化为外部表

    sql 复制代码
    alter table p3 set tblproperties ( 'EXTERNAL' = 'true');
  9. 外部表转化为内部表

    sql 复制代码
    alter table p3 set tblproperties ( 'EXTERNAL' = 'false');

分区表

  1. 分区表的最常见的作用也是对数据进行分类

  2. 案例

    1. 原始数据

      sql 复制代码
      -- wei
      1 荀彧
      2 荀攸
      3 贾诩
      4 郭嘉
      -- shu
      1 孙乾
      2 简雍
      3 糜竺
      4 庞统
      -- wu
      1 陆逊
      2 张昭
      3 鲁肃
      4 周瑜
    2. 在Hive中建表,管理数据,同时区分数据对应的国家

      sql 复制代码
      create table heros (
          id int, -- 编号
          name string -- 姓名
      ) partitioned by (country string)
       row format delimited fields terminated by ' ';
    3. 查看表

      sql 复制代码
      desc heros;
    4. 将数据加载到表中。当向分区表中加载数据的时候,如果没有指定分区,那么会将数据放入默认分区__HIVE_DEFAULT_PARTITION__

      sql 复制代码
      load data local inpath '/opt/hive_data/wei' into table heros partition(country = 'wei');
      load data local inpath '/opt/hive_data/shu' into table heros partition(country = 'shu');
      load data local inpath '/opt/hive_data/wu' into table heros partition(country = 'wu');
  3. 在Hive中,每一个分区对应HDFS上一个单独的目录!!!

  4. 在分区表中,当查询数据的时候以分区作为查询条件,可以提高查询效率;如果进行跨分区查询,那么此时效率会降低

  5. 手动在HDFS上创建的目录,默认不会自动加载到Hive的元数据中

  6. 手动建立分区

    sh 复制代码
    # 在HDFS上建立目录,上传文件
    hadoop fs -mkdir /user/hive/warehouse/demo.db/heros/country=qun
    hadoop fs -put qun /user/hive/warehouse/demo.db/heros/country=qun

    在Hive中手动添加分区

    sql 复制代码
    alter table heros add partition(country = 'qun') location '/user/hive/warehouse/demo.db/heros/country=qun';
    -- 或者 修复分区 - 有可能会修复失败,如果修复失败,那么此时只能手动add
    msck repair table heros;
  7. 修改分区名

    sql 复制代码
    alter table heros partition(country = 'qun') rename to partition(country = 'other');
  8. 删除分区

    sql 复制代码
    alter table heros drop partition(country = '__HIVE_DEFAULT_PARTITION__');
  9. 需要注意的是,在Hive中,分区字段在原始数据中是不存在的,而是在加载数据的时候手动指定,所以分区实际上可以认为是数据的"伪列"。如果原始数据中包含了分区字段,那么此时就需要进行动态分区

  10. 动态分区

    1. 原始数据

      sql 复制代码
      1 other 吕布
      2 wei 甘宁
      3 shu 马岱
      4 wei 王凌
      5 shu 糜芳
      6 shu 魏延
      7 other 刘璋
      8 wei 丁仪
      9 wu 周平
      10 shu 马忠
    2. 建立临时表

      sql 复制代码
      create table heros_tmp (
          hid int,
          h_country string,
          h_name string
      ) row format delimited fields terminated by ' ';
    3. 加载数据

      sql 复制代码
      load data local inpath '/opt/hive_data/heros' into table heros_tmp;
      -- 测试
      select * from heros_tmp tablesample(5 rows);
    4. 动态分区默认是不开启

      sql 复制代码
      -- 只对本次session有效,如果退出Hive重新进入,那么依然是严格模式
      set hive.exec.dynamic.partition.mode = nonstrict;
    5. 将未分区表中的数据插入到分区表中 - 动态分区

      sql 复制代码
      insert into table heros partition(country) select hid, h_name, h_country from heros_tmp distribute by h_country;
相关推荐
CoookeCola9 小时前
MovieNet(A holistic dataset for movie understanding) :面向电影理解的多模态综合数据集与工具链
数据仓库·人工智能·目标检测·计算机视觉·数据挖掘
K_i13418 小时前
Hadoop 集群自动化运维实战
运维·hadoop·自动化
Q264336502320 小时前
【有源码】基于Python与Spark的火锅店数据可视化分析系统-基于机器学习的火锅店综合竞争力评估与可视化分析-基于用户画像聚类的火锅店市场细分与可视化研究
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
想ai抽1 天前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
starfalling10241 天前
【hive】一种高效增量表的实现
hive
顧棟1 天前
【Yarn实战】Yarn 2.9.1滚动升级到3.4.1调研与实践验证
hadoop·yarn
D明明就是我1 天前
Hive 拉链表
数据仓库·hive·hadoop
嘉禾望岗5032 天前
hive join优化和数据倾斜处理
数据仓库·hive·hadoop
yumgpkpm2 天前
华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
大数据·hive·hadoop·elasticsearch·zookeeper·big data·cloudera
忧郁火龙果2 天前
六、Hive的基本使用
数据仓库·hive·hadoop