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

    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/news/783836.shtml

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

相关文章

jQuery的作用及入口函数

一、jQuery的作用 (1) jQuery &#xff1a;简洁、快速、灵活跨浏览器的JavaScript库&#xff0c;即js文件&#xff0c;由John Resig在2006年1月正式发布。 (2) jQuery强调的理念是“write less,do more” (3) 进入jQuery官方网站http://jquery.com下载最新的jQuery库文件。 (4)…

K8S之Configmap的介绍和使用

Configmap Configmap概述Configmap的简介Configmap能解决的问题Configmap应用场景局限性 Configmap创建方法通过命令行直接创建通过文件创建指定目录创建编写Configmap资源清单Yaml文件 Configmap的使用案例通过环境变量引入&#xff1a;使用configMapKeyRef通过环境变量引入&a…

零刻sei12 windows10 限制cpu最高频率,降低cpu功耗,调整风扇转速

为什么要降低cpu功耗 虽然风扇声音本身不大,但是我想在自习室用电脑,突然的风扇声音还是会影响到他人. 由于迷你主机集成度比较高不太可能换散热器,所以只能降低cpu功耗. 我的系统 版本 Windows 10 IoT 企业版 LTSC 版本号 21H2 安装日期 ‎2023/‎12/‎18 操作系统…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度&#xff0c;度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时&#xff0c;会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…

Android笔记(三十):PorterDuffXfermode实现旋转进度View

背景 核心原理是使用PorterDuffXfermode Path来绘制进度&#xff0c;并实现圆角 效果图 Android笔记(三十)效果演示 进度条绘制步骤 将ImageView矩形七个点的坐标存储起来&#xff08;configNodes&#xff09; 他们对应着7个不同的刻度&#xff0c;每个刻度的值 i * &#…

JAVAEE之网络编程

1.网络编程 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或称为网络数据传输&#xff09;。 当然&#xff0c;我们只要满足进程不同就行&#xff1b; 所以即便是同一个主机&#xff0c;只要是不同进程&am…

【MATLAB源码-第173期】基于matlab的RS编码的2FSK通信系统误码率仿真,通过AWGN信道输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 通信系统的基本框架 在现代通信系统中&#xff0c;数据的传输通常涉及四个基本步骤&#xff1a;源编码、信道编码、调制和传输。源编码主要负责压缩数据&#xff0c;减少传输的数据量。信道编码则通过添加冗余信息来提高传输…

扫雷(蓝桥杯)

题目描述 小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下&#xff0c; 在一个二维平面上放置着 n 个炸雷&#xff0c;第 i 个炸雷 (xi , yi ,ri) 表示在坐标 (xi , yi) 处存在一个炸雷&#xff0c;它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片土…

HANA中的内存及磁盘使用统计

1. 引言 在实际使用中&#xff0c;通过HANA的admin控制台&#xff0c;确实可以得到很多重要的信息。但有的时候不如人愿&#xff0c;你需要提供相应的SQL语句得到具体的信息。 比如&#xff0c;我要得到所有的行表的内存及磁盘占用信息&#xff1b;我需要得到所有列表的内存及…

os模块篇(一)

专栏目录 文章目录 专栏目录os.nameos.environos.environbos.chdir(path)os.fchdir(fd)os.getcwd()os.fsencode(filename)os.fsdecode(filename)os.fspath(path)os.getenv(key, defaultNone)os.getenvb(key, defaultNone)os.get_exec_path(envNone) os.name os.name是Python中…

数据库SQL语句速查手册

SQL 语句语法AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR conditionALTER TABLEALTER TABLE table_name ADD column_name datatypeorALTER TABLE table_name DROP COLUMN column_nameAS (alias)SELECT column_name AS column_alias FROM table_name…

AiEditor AI富文本编辑器

AI 时代&#xff0c;AIGC 正在蓬勃发展。作为一家 CMS 厂商&#xff0c;我们也正在积极寻求下一代 CMS 的迭代方向&#xff0c;以适应即将到来的新时代。 CMS 的一个核心能力是对 C&#xff08;Content&#xff09; 的编辑能力&#xff0c;它是通过 "编辑器" 来体现的…

基于springboot实现房屋租赁系统项目【项目源码+论文说明】

基于springboot实现房屋租赁系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本…

AWS创建IAM用户,以及通过IAM用户登录

基本概念&#xff1a; IAM Identity Center&#xff08;AWS SSO&#xff09; 跨账户访问&#xff1a;IAM Identity Center允许用户使用他们自己的单一登录凭证来访问多个AWS账户和应用程序。这意味着你可以拥有一个账户和密码&#xff0c;通过IAM Identity Center的用户门户&…

基于STM32的武警哨位联动报警系统设计,支持以太网和WIFI通信

1.功能 本文提出的武警报警信息系统终端&#xff0c;可实现报警和联动响应&#xff0c;支持以太网和WIFI两种通信模式&#xff0c;可实现移动哨位报警和固定哨位报警&#xff0c;语音和显示报警信息用户可自行定制。 本终端主要由STM32F103处理器模块和C8051F340处理器模块构…

路径规划——搜索算法详解(五):Dynamic A Star(D*)算法详解与Matlab代码

昨天休息了一天&#xff0c;今天继续学习搜索算法&#xff01;前几天已经分别介绍了Dijkstra算法、Floyd算法、RRT算法、A*算法&#xff0c;无独有偶&#xff0c;上述算法都只适用于静态环境下两点规划的场景&#xff0c;但是大部分场景是实时变化的&#xff0c;这对规划算法提…

2. 结构体内存对齐

2. 结构体内存对齐 2.1 对齐规则2.2 为什么存在内存对齐?2.3 修改默认对齐数 掌握了结构体的基本使用了。 现在我们深⼊讨论⼀个问题&#xff1a;计算结构体的大小。 这也是⼀个特别热门的考点&#xff1a; 结构体内存对齐 2.1 对齐规则 首先得掌握结构体的对齐规则&#xff…

【附升级gpt4.0方案】探索人工智能在医疗领域的革命

随着科技的飞速发展&#xff0c;人工智能已经逐渐渗透到了各个领域&#xff0c;其中医疗领域更是受益匪浅。本文将探讨人工智能在医疗领域的应用及其带来的革命性影响。 1. 人工智能辅助诊断 在医学诊断中&#xff0c;准确性至关重要。传统的诊断方法往往依赖于医生的经验和知…

服务器永久运行jar包(linux系统)

前言 在上篇博客里已经写了永久运行jar包的命令&#xff0c;但是有可能这个命令没有生效&#xff0c;所以再写一篇详细一点的&#xff0c;也是本人的踩坑经历。 再贴一次永久运行jar包命令 nohup java -jar 文件名 > 日志文件名 2>&1 &报错及检查 输入命令后…

Linux|如何管理多个Git身份

摘要 关于如何管理不同项目和多个Git身份。 作为一名通用软件开发者&#xff0c;我经常发现自己在处理各种各样的项目&#xff0c;每个项目都有自己的要求和期望。这包括为个人、工作和客户项目管理不同的Git身份。以下是我组织Git仓库以简化这一过程的方法。 目录组织 我将我的…