【Hive】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使用

安装

安装MySQL

  1. CentOS7自带MySQL,需要先卸载这个MySQL:

    rpm -qa | grep -i mysql | xargs rpm -ev --nodeps
    rpm -qa | grep -i mariadb | xargs rpm -ev --nodeps
    
  2. 扇出MySQL可能残留的配置文件

    find / -name mysql | xargs rm -rf
    find / -name my.cnf | xargs rm -rf
    rm -rf /var/lib/mysql/
    
  3. 进入预安装目录,上传或者下载MySQL的安装包

    cd /opt/presoftware/
    # 上传/下载MySQL的安装包
    
  4. 解压

    tar -xvf mysql-5.7.33-1.el7.x86_64.rpm-bundle.tar
    
  5. 安装MySQL,并且顺序不能颠倒!!!

    rpm -ivh mysql-community-common-5.7.33-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-5.7.33-1.el7.x86_64.rpm
    rpm -ivh mysql-community-devel-5.7.33-1.el7.x86_64.rpm 
    rpm -ivh mysql-community-libs-compat-5.7.33-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-5.7.33-1.el7.x86_64.rpm
    rpm -ivh mysql-community-server-5.7.33-1.el7.x86_64.rpm
    
  6. 启动MySQL

    systemctl start mysqld
    
  7. 第一次安装MySQL,会自动生成初始密码

    grep "temporary password" /var/log/mysqld.log
    
  8. 登陆MySQL

    mysql -u root -p
    # 输入初始密码
    
  9. 默认情况下,MySQL的规则要求,密码至少要包含12个字符,至少包含1个大写字母、1个小写字母、1个数字和1个特殊符号。在实际开发过程中,密码肯定要求复杂度;学习环境下,密码不需要这么复杂,所以需要修改MySQL的密码规则

    -- 修改MySQL关于密码长度的限制
    set global validate_password_length = 4;
    -- 修改MySQL关于密码字符类型的限制
    set global validate_password_policy = 0;
    
  10. 修改MySQL的密码

    -- 为root@localhost设置密码为root
    set PASSWORD FOR 'root'@'localhost' = "root";
    
  11. 配置MySQL的远程连接

    -- 开放权限
    grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
    -- 策略生效
    flush privileges;
    
  12. 测试

    # 退出MySQL
    quit;
    # 重新进入MySQL
    mysql -u root -p
    

安装Hive

  1. 进入预安装目录,上传或者下载Hive的安装包。注意:上课使用的Hive的安装包不是官网提供的,而是我们自己编译好的。官网提供的Hive安装包,最多支持Spark2,但是现在使用的比较多的Spark3版本,也因此,实际过程中,如果想要让Hive支持Spark3,就意味着需要自己下载Hive的源代码并且修改,自己编译!!!

    cd /opt/presoftware/
    # 上传/下载安装包
    
  2. 解压

    tar -xvf apache-hive-3.1.3-bin.tar.gz -C /opt/software/
    
  3. 重命名

    cd ../software/
    mv apache-hive-3.1.3-bin/ hive-3.1.3
    
  4. 配置环境变量

    # 编辑文件
    vim /etc/profile.d/hivehome.sh
    # 在文件中添加
    export HIVE_HOME=/opt/software/hive-3.1.3
    export PATH=$PATH:$HIVE_HOME/bin
    # 保存退出,生效
    source /etc/profile.d/hivehome.sh
    # 测试hive --version
    
  5. 解决Hive的日志jar包冲突的问题

    cd hive-3.1.3/lib/
    mv log4j-slf4j-impl-2.17.1.jar log4j-slf4j-impl-2.17.1.bak
    
  6. 给Hive添加MySQL的连接驱动

  7. 修改Hive的配置

    cd ../conf
    # 编辑文件
    vim hive-site.xml
    

    在文件中添加

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration><!--Hive元数据库--><property><name>hive.metastore.db.type</name><value>mysql</value></property><!--MySQL连接地址--><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://hadoop01:3306/hive?useSSL=false</value></property><!--MySQL驱动--><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><!--MySQL用户名--><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value></property><!--MySQL密码--><property><name>javax.jdo.option.ConnectionPassword</name><value>root</value></property><!--Hive元数据的存储位置--><property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value></property><!--Hive元数据的约束--><property><name>hive.metastore.schema.verification</name><value>false</value></property><!--Hive元数据的访问位置--><property><name>hive.metastore.uris</name><value>thrift://hadoop01:9083</value></property><!--Hive服务的访问端口--><property><name>hive.server2.thrift.port</name><value>10000</value></property><!--Hive服务监听的主机--><property><name>hive.server2.thrift.bind.host</name><value>hadoop01</value></property><!--Hive的自动认证--><property><name>hive.metastore.event.db.notification.api.auth</name><value>false</value></property><property><name>datanucleus.schema.autoCreateAll</name><value>true</value></property>
    </configuration>
    
  8. 初始化元数据库

    # 进入MySQL
    mysql -u root -p
    

    在MySQL中建立元数据库,注意元数据库的编码必须是latin1

    create database hive character set latin1;
    -- 退出
    quit;
    

    初始化元数据库

    schematool -initSchema -dbType mysql --verbose
    
  9. 因为Hive基于Hadoop的(利用HDFS存储数据,利用MapReduce计算),所以需要启动Hadoop

    start-all.sh
    
  10. 启动Hive的元数据服务

    hive --service metastore &
    
  11. 启动Hive

    hive
    

基础语法

注意问题

  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. 查看所有的库

    show databases;
    
  2. 建库

    create database demo;
    
  3. 删除库。要求库必须是空的

    drop database demo;
    
  4. 建库的时候指定库的存储位置

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

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

    create database if not exists demo;
    
  7. 强制删除库

    drop database demo cascade;
    
  8. 使用库

    use demo;
    
  9. 建库的时候还给库指定属性

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

    desc database demo2;
    
  11. 描述库的详细信息

    desc database extended demo2;
    
  12. 修改库的属性

    alter database demo2 set dbproperties('create_time'='024-03-27');
    

表及数据操作

  1. 创建表

    create table person ( id int, name string, age int);
    
  2. 插入数据

    insert into table person values(1, 'Amy', 15);
    

    转化为MapReduce执行

  3. 查询数据

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

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

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

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

    show tables;
    
  8. 描述表

    desc person
    
  9. 创建p2表,p2的表结构和person一样

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

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

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

    insert into table p2 select * from person where age >= 18;
    

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

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

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

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

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

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

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

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

  16. 将person表重命名为p1

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

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

    alter table p1 add columns(gender string);
    

表结构

内部表和外部表

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

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

  3. 可以通过

    desc extended p1;
    -- 或者
    desc formatted p1;
    

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

  4. 建立外部表

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

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

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

  8. 内部表转化为外部表

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

    alter table p3 set tblproperties ( 'EXTERNAL' = 'false');
    

分区表

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

  2. 案例

    1. 原始数据

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

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

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

      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. 手动建立分区

    # 在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中手动添加分区

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

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

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

  10. 动态分区

    1. 原始数据

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

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

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

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

      insert into table heros partition(country) select hid, h_name, h_country from heros_tmp distribute by h_country;
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s相关常用语句

打标签 kubectl label nodes kubernetes.io/hostname10.78.16.4 envproduction kubectl label nodes kubernetes.io/hostnamecn-shenzhen.10.78.16.4 envproduction 查询 ktctl.exe connect -n master docker exec -it ‘271d3c847417’ /bin/bash docker container ls 查…

国产操作系统上使用HHDESK桌面运维工具 _ 统信UOS _ 麒麟

原文链接&#xff1a;国产操作系统上使用HHDESK桌面运维工具 | 统信UOS | 麒麟 Hello&#xff0c;大家好啊&#xff01;在多功能软件的帮助下&#xff0c;日常的计算机操作可以变得更加高效便捷。今天&#xff0c;我要向大家介绍的是HHDESK&#xff0c;这是一款功能丰富的工具&…

点云工具 CloudCompare 查看三维模型

CloudCompare 是一款三维点云&#xff08;Point Cloud&#xff09;处理软件&#xff0c;可以方便地使用计算法向量、优化法向量、泊松构网、滤波等功能。 工具下载地址&#xff1a;nullCloudCompare website entry pagehttps://cloudcompare.org/ github地址&#xff1a; GitH…

【JavaEE网络】用Form与Ajax构建HTTP请求

目录 通过 form 表单构造 HTTP 请求form 发送 GET 请求form 发送 POST 请求 通过 ajax 构造 HTTP 请求发送 GET 请求发送 POST 请求发送 application/json 数据封装 ajax 方法 通过 form 表单构造 HTTP 请求 form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET …

权限束缚术--权限提升你需要知道这些

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要对渗透测试中权限提升的一些基础知识进行整理 并不包含权限提升的具体操作 适合要入门权限提升的朋友 提权的重要性 我们在渗透网站时&#xff0c;我们往往会拿到一些权限&#xff0c;但是我们的权限有…

Mybatis之ResultMap

前言 select语句查询得到的结果集是一张二维表&#xff0c;水平方向上看是一个个字段&#xff0c;垂直方向上看是一条条记录。而Java是面向对象的程序设计语言&#xff0c;对象是根据类定义创建的&#xff0c;类之间的引用关系可以认为是嵌套的结构。在JDBC编程中&#xff0c;…

上位机图像处理和嵌入式模块部署(树莓派4b和进程监控)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然软件开发的时候&#xff0c;我们总是希望软件不要发生bug、不要有闪退、甚至于说不要有内存泄漏&#xff0c;但这也只是我们自己的一厢情愿而已…

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么&#xff1f;重复的机械操作。我们刚接…

读书笔记——《高质量C++/C编程指南》(4)

前言 前两篇笔记对这本书里面的文件结构、代码风格、命名规则、表达式和基本语句的良好编程习惯&#xff0c;将记录常量与函数设计做了记录。本篇读书笔记&#xff08;4&#xff09;将记录 内存管理 内存分配方式 内存分配的方式有三种&#xff1a; &#xff08;1&#xf…

oracle中保存点的使用

在Oracle数据库中&#xff0c;保存点&#xff08;Savepoint&#xff09;是一个重要的概念&#xff0c;它允许用户在事务执行过程中设置一个或多个标记点&#xff0c;以便在后续的操作中可以回滚到这些标记点&#xff0c;而不是回滚整个事务。保存点的主要作用是提高事务处理的效…

sql分页查询

引言 在数据库管理和开发中&#xff0c;分页查询是一项常见的需求&#xff0c;尤其在处理大量数据时。作为资深DBA工程师&#xff0c;掌握SQL分页查询技术至关重要。本文将深入探讨SQL分页查询的原理、方法以及最佳实践。 一、分页查询的原理 分页查询的原理是将整个结果集按…

JAVA 项目<果园之窗>_完结

目录 1、前言&#xff1a;2、视频展示&#xff1a;3、环境配置&#xff1a;4、工程代码&#xff1a;5、原理&#xff1a;6、原理补充&#xff1a;7、综上&#xff1a; 1、前言&#xff1a; 因为没有足够的时间这个项目用的是别人搭好的框架&#xff0c;在此基础上做调整并根据前…

【机器学习】线性回归:以房价预测为例

线性回归&#xff1a;揭秘房价预测的黑科技 一、引言二、线性回归概述三、房价预测实例数据收集与预处理特征选择与建模模型评估与优化 四、总结与展望 一、引言 在数字化时代&#xff0c;数据科学已成为推动社会进步的重要引擎。其中&#xff0c;线性回归作为数据科学中的基础…

Linux: binutils: dwp coredump __GI_fseek,

[root@RH8-LCP ~]# rpm -qf /usr/bin/dwp binutils-2.30-113.el8.x86_64 使用dwp查看clang编译出来的文件,会导致dwp产生coredump。 clang的版本: [root@RH8-LCP ~]# strings envoy | grep -i clang | more Ubuntu clang version 14.0.0-1ubuntu1.1 Ubuntu clang version 14.…

【研发日记】Matlab/Simulink避坑指南(十二)——Initialize Function执行Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(八)——else if分支结构Bug》 见《研发日记&#xff0c;Matlab/Simuli…

【敦煌网注册/登录安全分析报告】

敦煌网注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大…

H5 鼠标点击粒子扩散效果

&#x1f9d0;别人的博客中有这样的效果&#xff0c;于是自己就尝试实现了一下。 效果如图 源码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

vue3+ant design实现表格数据导出Excel

提示:实现表格数据导出Excel 文章目录 前言 一、安装ant design? 二、引用ant design 1.搭建框架 2.获取表格数据 三、封装导出表格的代码 四、导出 1.获取导出地址 2.在下载导出事件中添加导出代码 五、全部代码 前言 今天终于有时间来更新文章了,最近公司项目比较紧…

如何打开远程桌面连接?

远程桌面连接是一项强大的功能&#xff0c;它允许我们远程访问其他计算机&#xff0c;并在远程计算机上进行操作。这对于远程办公、技术支持和远程培训等场景非常有用。本文将介绍如何在不同操作系统中打开远程桌面连接。 Windows系统 在Windows操作系统中&#xff0c;打开远程…

第二证券今日投资参考:银保渠道合作限制松绑 低空旅游借势起飞

昨日&#xff0c;两市股指盘中震动上扬&#xff0c;沪指一度涨近1%续创年内新高&#xff0c;创业板指一度涨超2%。到收盘&#xff0c;沪指涨0.83%报3154.32点&#xff0c;深证成指涨1.55%报9788.07点&#xff0c;创业板指涨1.87%报1900.01点&#xff0c;科创50指数涨2.26%&…