• 12-Hive的基本概念以及基本操作


    七、Hive

    🔖 Day 12-Hive入门

    重点掌握

    1、完成Hive的安装
    2、掌握Hive的系统架构
    3、掌握Hive的元数据
    4、掌握Hive的DDL语法操作(有时间反复练习)
    5、掌握Hive中表的创建及操作理解内部表和外部表的区别
    6、掌握分区表和分桶表的区别和应用
    7、掌握表数据的导入导出

    理解内容

    1、Hive的技术介绍和原理 -01
    2、Hive的优缺点 -02

    mv apache-hive-3.1.2-bin /opt/yjx

      295  rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      296  rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      297  cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/
      298  cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/
      299  vim /etc/profile
      300  scp /etc/profile root@node02:/etc/profile
      301  scp /etc/profile root@node03:/etc/profile
      302  source /etc/profile
      303  scp /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml root@node02:/opt/yjx/hadoop-3.1.2/etc/hadoop/
      304  scp /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml root@node03:/opt/yjx/hadoop-3.1.2/etc/hadoop/
      305  hsitory
      306  history
      307  zkServer.sh start
      308  zkServer.sh status
      309  zkServer.sh start
      310  zkServer.sh status
      311  start-all.sh 
      312  zkServer.sh start
      313  zkServer.sh status
      314  jps
      315  schematool -dbType mysql -initSchema
      316  hive --service metastore
      317  schematool -dbType mysql -initSchema
      318  vim /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml
      319  cd /opt/yjx/apache-hive-3.1.2-bin/conf
      320  vim hive-site.xml
      321  zkServer.sh status
      322  start-all.sh
      323  schematool -dbType mysql -initSchema
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    7.1 Hive基本概念

    image-20220624193804802

    Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化和半结构化的数据文件映射为一张数据库表,并提供简单的 sql 查询功能

    7.1.1 Hive介绍

    1. Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步可以说hive就是一个MapReduce客户端

      image-20220624220410523

    2. 使用Hive的原因

      • 直接不使用hadoop
        1)人员学习成本太高
        2)项目要求周期太短
        3)MapReduce实现复杂查询逻辑开发难度太大
      • 为什么要使用Hive
        1)操作接口采用类SQL语法,提供快速开发能力
        2)免去了写MapReduce,减少开发人员学历成本
        3)功能扩展很方便
    3. Hive的特点

      • 可扩展性
        Hive可以自由的扩展集群的规模,一般情况下不需要重启服务
      • 延伸性
        Hive支持自定义函数,用户可以根据自己的需要来实现自己的函数
      • 容错
        即使节点出现错误,SQL仍然可以完成执行
    4. Hive优缺点

      • 优点

        • 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
        • 避免了去写MapReduce,减少开发人员的学习成本。
        • Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
        • Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
        • Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
        • 集群可自由拓展并且具有良好的容错性,节点出现问题SQL仍可完成执行。
      • 缺点

        • Hive的HQL表达能力有限
          (1)迭代式算法无法表达
          (2)数据挖掘方面不擅长

        • Hive的效率比较低
          (1)Hive自动生成的MapReduce作业,通常情况下不够智能化
          (2)Hive调优比较困难,粒度较粗

    5. Hive和传统数据库对比

      image-20220624220811260

    6. Hive的应用场景

      • 日志分析:大部分互联网公司使用hive进行日志分析,包括百度、淘宝等。
        • 统计网站一个时间段内的pv、uv
        • 多维度数据分析
      • 海量结构化数据离线分析

    7.1.2 Hive架构

    image-20220624221027656

    1. Client

    • Hive允许client连接方式有三个,CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)。JDBC访问中间件Thrift软件矿建,跨语言服务开发。DDL DQLDML,整体仿写一套SQL语句。

      • client–需要下载安装包

      • JDBC/ODBC 也可以连接到Hive

        • 现在主流都在倡导第二种 HiveServer2/beeline
        • 做基于用户名和密码安全的一个校验
      • Web Gui

        • hive给我们提供了一套简单的web页面
        • 我们可以通过这套web页面访问hive
        • 做的太简陋了

    2. Metastore

    元数据,包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

    • 一般需要借助于其他的数据载体(数据库)
    • 主要用于存放数据库的建表语句等信息
    • 推荐使用Mysql数据库存放数据
    • 连接数据库需要提供:uri username password driver

    3. Driver

    元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中 ,推荐使用Mysql进行存储。

    • 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完
      成,比如ANTLR;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
    • 编译器(Physical Plan):将AST编译生成逻辑执行计划。
    • 优化器(Query Optimizer):对逻辑执行计划进行优化。
    • 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是
      MR/Spark。

    4. 数据处理

    Hive的数据存储在HDFS中,计算由MapReduce完成。HDFS和MapReduce是源码级别上的整合,两者结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。

    7.1.3 Hive的安装

    节点\功能metastorehiveserver2client
    node01
    node02
    node03
    • 安装前 请确认当前集群已经安装了Mysql数据库和Hadoop的Ha+Yarn

    7.1.4 Hive的三种交互方式

    1. 第一种交互方式

    • shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。
      • 服务端启动metastore服务:nohup hive --service metastore > /dev/null 2>&1 &
      • 简洁启动: hive --service metastore
      • 进入命令:hive
      • 退出命令行:quit;

    2. 第二种交互方式(推荐)

    • Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作,这是生产环境用法最多的
      • 给予权限:hadoop fs -chmod -R 777 /yjx
      • 服务端启动hiveserver2服务(先后启动):
        • nohup hive --service metastore > /dev/null 2>&1 &
        • nohup hiveserver2 > /dev/null 2>&1 &
        • 需要稍等一下,启动服务需要时间
      • 进入命令
        • 直接执行 beeline -u jdbc:hive2://node01:10000 -n root
      • 退出
        • !exit

    3. 第三种交互方式

    • 使用 -e 参数来直接执行hql的语句

      • bin/hive -e “show databases;”
    • 使用 –f 参数通过指定文本文件来执行hql的语句

      • vim hive.sql
        use myhive;
        select * from test;
    • 保存退出

      • hive -f hive.sql
    • 特点:执行完sql后,回到linux命令行。

    4. hive cli和beeline cli的区别

    image-20220624225851538
    • metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive元数据,并且通过thrift获
      取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。
      HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。一般
      来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。 而MetaStore才是用来访问元数据的。
    • beeline cli优化了命令行界面

    7.1.5 Hive元数据

    Hive元数据库中一些重要的表结构及用途,方便Impala、SparkSQL、Hive等组件访问元数据库的理解。

    1. 存储Hive版本的元数据表(VERSION)
      该表比较简单,但很重要。

    7.2 Hive的基本操作

    7.2.1Hive的基本操作

    1. 创建数据库

      • 创建一个数据库,数据库在HDFS上的more存储路径是 /hive/warehouse/*.db
        • create database shop;
      • 避免要创建的数据库已经存在错误,增加if not exists判断
        • create database if not exists shop;
    2. 创建数据库同时指定位置

      • create database if not exists school location ‘/school.db’;
    3. 修改数据库

      用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

      • alter database school set dbproperties(‘createtime’=‘20201213’);
    4. 数据库详细信息

      • 显示数据库(show)
        • show databases;
      • 可以通过like进行过滤
        • show databases like ‘s*’;
      • 查看详情(desc)
        • desc database school;
      • 切换数据库(use)
        • use school;
    5. 删除数据库

      • 最简写法
        • drop database school;
      • 如果删除的数据库不存在,最好使用if exists判断数据库是否存在。否则会报错:FAILED:
        SemanticException [Error 10072]: Database does not exist: db_hive
        • drop database if exists school;
      • 如果数据库不为空,使用cascade命令进行强制删除。报错信息如下FAILED: Execution Error, returncode 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
        • drop database if exists school cascade;

    7.2.2 Hive数据类型

    1. 基础数据类型

    类型Java据类型描述
    TINYINTbyte8位有符号整型。取值范围:-128~127。
    SMALLINTshort16位有符号整型。取值范围:-32768~32767。
    INTint32位有符号整型。取值范围:-2 31 ~2 31 -1。
    BIGINTlong64位有符号整型。取值范围:-2 63 +1~2 63 -1。
    BINARY二进制数据类型,目前长度限制为8MB。
    FLOATfloat32位二进制浮点型。
    DOUBLEdouble64位二进制浮点型。
    DECIMAL(precision,scale)10进制精确数字类型。precision:表示最多可以表示多少位的数字。取值范围: 1 <= precision <= 38 。scale:表示小数部分的位数。取值范围: 0 <= scale <= 38 。如果不指定以上两个参数,则默认为 decimal(10,0) 。
    VARCHAR(n)变长字符类型,n为长度。取值范围:1~65535。
    CHAR(n)固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。
    STRINGstring字符串类型,目前长度限制为8MB。
    DATE日期类型,格式为yyyy-mm-dd 。取值范围:0000-01- 01~9999-12-31。
    DATETIME日期时间类型。取值范围:0000-01-01 00:00:00.000~9999-12-31 23.59:59.999,精确到毫 秒。
    TIMESTAMP与时区无关的时间戳类型。取值范围:0000-01-01 00:00:00.000000000~9999-12-31 23.59:59.999999999,精确到纳秒。说明 对于部分时区相关的函数,例如cast( as string) ,要求TIMESTAMP按照与当前时区相符的方式来展现。
    BOOLEANbooleanBOOLEAN类型。取值:True、False。

    2.复杂数据类型

    类型定义方法构造方法
    ARRAYarray``array<struct<a:int, b:string>>array(1, 2, 3)``array(array(1, 2), array(3, 4))
    MAPmap<string, string>``map<smallint, array>map(“k1”, “v1”, “k2”, “v2”)``map(1S, array(‘a’, ‘b’), 2S, array(‘x’, ‘y’))
    STRUCTstruct<x:int, y:int>``struct<field1:bigint, field2:array, field3:map<int, int>>named_struct(‘x’, 1, ‘y’, 2)``named_struct(‘field1’, 100L, ‘field2’, array(1, 2), ‘field3’, map(1, 100, 2, 200))

    Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

    7.2.3 Hive表操作

    1. 创建表

      CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
      [(col_name data_type [COMMENT col_comment], ...)]
      [COMMENT table_comment]
      [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
      [CLUSTERED BY (col_name, col_name, ...)
      [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
      [ROW FORMAT row_format]
      [STORED AS file_format]
      [LOCATION hdfs_path]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      字段解释说明:

      • CREATE TABLE
        创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项
        来忽略这个异常。
      • EXTERNAL
        关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
        创建内部表时,会将数据移动到数据仓库指向的路径(默认位置);
        创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。在
        删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
      • COMMENT:
        为表和列添加注释。
      • PARTITIONED BY
        创建分区表
      • CLUSTERED BY
        创建分桶表
      • SORTED BY
        不常用
      • ROW FORMAT
        DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH
        SERDEPROPERTIES (property_name=property_value, property_name=property_value,
        …)]
        用户在建表的时候可以自定义SerDe或者使用自带的SerDe。
        如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。
        在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过
        SerDe确定表的具体的列的数据。
        SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
      • STORED AS指定存储文件类型
        常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储
        格式文件)
        如果文件数据是纯文本,可以使用STORED AS TEXTFILE。
        如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
      • LOCATION :指定表在HDFS上的存储位置。
      • LIKE
        允许用户复制现有的表结构,但是不复制数据。
    • 创建表案例:根据数据创建表结构

      • 案例一:简单用户信息

        • use.txt文件(表信息)

          1,admin,123456,男,18
          2,zhangsan,abc123,男,23
          3,lisi,654321,女,16
          
          • 1
          • 2
          • 3
        • 创建表

          create  table t_useraaa(
          id int,
          uname string,
          pwd string,
          gender string,
          age int
          )
          row format delimited fields terminated by ','
          lines terminated by '\n';
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
        • 加载表

          --载入数据代码
          load data inpath '/yjx/user.txt' into table t_user;
          
          • 1
          • 2
      • 案例二:复杂人员数据

        • person.txt文件

          songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui longguan_beijing
          yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
          
          • 1
          • 2
        • 创建表并载入表

          create table IF NOT EXISTS t_person(
          name string,
          friends array<string>,
          children map<string,int>,
          address struct<street:string ,city:string>
          )
          row format delimited fields terminated by ','
          collection items terminated by '_'
          map keys terminated by ':'
          lines terminated by '\n';
          --载入数据代码
          load data inpath '/yjx/person.txt' into table t_person;
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
    1. 显示表

      show tables;
      show tables like 'u';
      desc t_person;
      desc formatted t_person;
      
      • 1
      • 2
      • 3
      • 4
    2. 重命名

      内部表(同时修改文件目录)外部表(因为目录是共享的,所以不会修改目录名称)

      • 基本语法
        • alter table old_table_name rename to new_table_name;
      • 示例:把t_old改成t_new
        • alter table t_old rename to t_new;
    3. 修改列

      • 查询表结构
        • desc test_new;
      • 添加列
        • alter table test_new add columns (education string);
      • 查询表结构
        • desc test_new;
      • 更新列
        • alter table test_new change education educationnew string;
    4. 删除表

      • drop table test_new;
        • 如果在删除表之前把该表在HDFS上备份一份,则该表数据还可以找回

    7.2.4 Hive内外部表

    1. 内部表

    • 建表时
      • 当创建好表时,HDFS会在当前表所在的库中同时创建一个文件夹(默认创建)
      • 当设置好路径的时候,如果直接指向一个已有的路径,可以直接去使用文件夹中的数据
    • 导入数据到表中时
      • 当load数据的时候,就会将数据文件存放到表对应的文件中
      • 而且数据一旦被load,就不能被修改
    • 查询数据时
      • 我们查询数据也是查询文件夹中的文件,这些数据最终都会存放到HDFS上
      • 当我们删除表的时候,表对应的文件夹会被删除,同时数据也会被删除

    2. Hive外部表

    7.2.5 Hive分区表

    7.2.6 分桶表

  • 相关阅读:
    Kettle查询表数据循环到目标表
    图论_3。
    车间调度动态知多少
    适用于现代制造业的ERP系统有哪些?
    Java开发中常用的Linux命令
    【k8s】一、基础实验环境准备
    量化交易是什么意思,量化到底是怎么赚钱的?
    线性DP例题
    【Unity ShaderGraph】| 给模型添加一个 边缘光效果 实战
    2D物理引擎 Box2D for javascript Games 第五章 碰撞处理
  • 原文地址:https://blog.csdn.net/weixin_50627985/article/details/125453994