Apache Hive入门

news2024/11/15 4:48:15

文章目录

  • 一、Apache Hive概述
    • 1.1、什么是Hive
    • 1.2、使用Hive原因
    • 1.3、Hive和Hadoop关系
  • 二、Hive功能思想
    • 2.1、映射信息记录
    • 2.2、SQL语法解析、编译
  • 三、Hive架构、组件
    • 3.1、Hive架构图
    • 3.2Hive组件
  • 四、Hive常用操作
    • 4.1、数据类型
      • 4.1.1、基本数据类型
      • 4.1.2、集合数据类型
    • 4.2、数据库
    • 4.3、数据表
      • 4.3.1、创建表语法
      • 4.3.2、external
      • 4.3.3、 temporary
      • 4.3.4、 在创建表时没有导入数据使用
      • 4.3.5、 partitioned by分区表
      • 4.3.6、 clustered by ... sorted by ... into ...buckets分桶表
      • 4.3.7、CTAS
      • 4.3.8、CTE
      • 4.3.9、LIKE
      • 4.3.10、export(导出)、import(导入)
      • 4.3.11、清空表数据

一、Apache Hive概述

1.1、什么是Hive

  • Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,成为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
  • Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop执行。
  • Hive官网

1.2、使用Hive原因

  • 使用Hadoop MapReduce直接处理数据所面临的问题。

人员学习成本高,需要掌握java语言。
MapReduce实现复杂查询逻辑开发难度太大。

  • 使用Hive处理数据的好处

操作接口采用类SQL语法,提供快速开发的能力。(简单、容易上手)
避免直接写MapReduce,减少开发人员的学习成本。
支持自定义函数,功能扩展方便。
背靠Hadoop,擅长存储分析海量数据集。

1.3、Hive和Hadoop关系

  • Hadoop是一个能够对大量数据进行分布式处理的软件框架。Hadoop最核心的设计就是hdfs和mapreduce,hdfs提供存储,mapreduce用于计算。
  • Hive是Hadoop的延申。hive是一个提供了查询功能的数据仓库核心组件,Hadoop底层的hdfs为hive提供了数据存储,mapreduce为hive提供了分布式运算。
  • Hive可以直接通过SQL操作Hadoop,sql简单易写,可读性强,hive将用户提交的SQL解析为MapReduce任务供Hadoop直接运行。

二、Hive功能思想

在这里插入图片描述

2.1、映射信息记录

  • 映射在数学十行称之为一种对应关系,比如y=x+1,对于每一个x的值都有与之对应的y的值。
  • 在hive中能够写sql处理的前提是针对表,而不是针对文件,因此需要将文件和表之间的对应关系描述记录清楚。
    映射信息专业名称为:元数据信息(元数据是值用来描述数据的数据 metadata)
  • 具体来看,要记录的元数据信息包括:
    表对应着哪个文件(位置信息)、表的列对应着文件哪一个字段(顺序信息)、文件字段之间的分隔符是什么。

在这里插入图片描述

2.2、SQL语法解析、编译

  • 用户写完SQL之后,Hive会针对SQL进行语法校验,并且根据记录的元数据信息解读sql背后的含义,制定执行计划。
  • 并且把执行计划转换成MapReduce程序来具体执行,把执行的结果封装返回给用户。

三、Hive架构、组件

3.1、Hive架构图

在这里插入图片描述

3.2Hive组件

  • 用户接口
    包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许
    外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。

在这里插入图片描述

  • 元数据存储
    通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是
    否为外部表等),表的数据所在目录等。

在这里插入图片描述

  • Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器
    完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储咋HDFS中,并在随后又执行引擎调用执行。
    在这里插入图片描述
  • 执行引擎
    Hive本身并不是直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark 3种执行引擎。
    在这里插入图片描述

四、Hive常用操作

4.1、数据类型

4.1.1、基本数据类型

类型实例
TINYINT10
INT10
SMALLINT10
BIGINT100L
FLOAT1.342
DOUBLE1.234
BINARY1010
BOOLEANTRUE
DECIMAL3.14
CHAR'book’or"book"
STRING'book’or"book"
VARCHAR'book’or"book"
DATE‘2023-02-27’
TIMESTAMP‘2023-02-277 00:00:00’

4.1.2、集合数据类型

类型格式定义示例
ARRAY[‘apple’,‘hive’,‘orange’]ARRAY< string>a[0]=‘apple’
MAP{‘a’:‘apple’,‘o’:‘orange’}MAP< string,string>b[‘a’]=‘apple’
STRUCT{‘apple’,2}STRUCT< fruit:string,weight:int>c.weight=2

4.2、数据库

数据库在HDFS中表现为一个文件夹,在配置文件中hive.metastore.warehouse.dir属性目录下。
在这里插入图片描述
如果没有指定数据库,默认使用default数据库

# 创建数据库
create database if not exists 库名;
# 使用数据库
use 库名;
# 查看数据库
show databases;
# 查看数据库详细信息
describe database 库名;
# 修改数据库的使用者
alter database 库名 set owner user 用户名;
# 强制删除数据库(cascade) 在不使用cascade时若库内有表有数据时,会删除失败。
drop database if exists 库名 cascade;
# 查看当前数据库
select current_database();

4.3、数据表

  1. 分为内部表和外部表
  2. 内部表
    • HDFS中为所属数据库目录下的子文件夹
    • 数据完全由Hive管理,删除表(元数据)会删除数据
  3. 外部表
    • 数据保存在指定位置的HDFS路径下
    • Hive不完全管理数据,删除表(元数据)不会删除数据

4.3.1、创建表语法

create [ temporary] [ external] table [ if not exists]
[db_name.]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, col_name, ...)]
[ row format row_format]
[ stored as file_format]
[ location hdfs_path]
[ tblproperties (proeprty_name=property_value, ...)] 

在这里插入图片描述

4.3.2、external

外部表,与之对应的时内部表。内部表一位置hive会完全接管该表,包括元数据和HDFS中的数据。而外部表意味着hive只接管元数据,而不完全接管HDFS中的数据。

create external table studentwb1
(
    id      int,
    name    string,
    likes   array<string>,
    address map<string,string>
)
    row format delimited fields terminated by ','
        collection items terminated by '-'
        map keys terminated by ':'
        lines terminated by '\n'
        location '/tmp/hivedata/student';

4.3.3、 temporary

临时表,该表只在当前会话可见,会话结束,表会被删除。

create temporary table studentwb1
(
    id      int,
    name    string,
    likes   array<string>,
    address map<string,string>
)
    row format delimited fields terminated by ','
        collection items terminated by '-'
        map keys terminated by ':'
        lines terminated by '\n'
        location '/tmp/hivedata/student';

4.3.4、 在创建表时没有导入数据使用

#加载本地数据
	load data local inpath '/opt/student.txt' into table 表名;
#加载hdfs数据(内部表时,会将文件移动到表目录下)
	load data inpath '/opt/student.txt' into table 表名;    (追加)
	load data inpath '/opt/student.txt' overwrite into table 表名;    (覆盖)

4.3.5、 partitioned by分区表

# 创建分区表
create table student_pt
(
    id      int,
    name    string,
    likes   array<string>,
    address map<string,string>
)
    partitioned by (age int)
    row format delimited fields terminated by ','
        collection items terminated by '-'
        map keys terminated by ':'
        lines terminated by '\n';
# 直接定义分区将文件导入分区表
load data inpath "/tmp/hivedata/student/student2.txt" into table student_pt partition (age = 20);

# 将其他表数据导入分区表
-- 动态分区(可在配置文件中设置)
set hive.exec.dynamic.partition=true;     --是否开启动态分区
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table student_pt partition (age)select id,name,likes,address,age from student_pt;

# 查看分区
show partitions 表名;

4.3.6、 clustered by … sorted by … into …buckets分桶表

--------------------------------------分桶表---------------------------
-------------------------原始数据-------------------------------
create table employee_id(
    name string,
    employee_id int,
    work_place array<string>,
    gender_age struct<gender:string,age:int>,
    skills_score map<string,int>,
    depart_title map<string,array<string>>
)
row format delimited fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';

# 导入数据
load data local inpath '/opt/stufile/employee_id.txt' overwrite into table employee_id;

-------------------------------创建分桶表--------------------------------------
create table employee_id_buckets(
    name string,
    employee_id int,
    work_place array<string>,
    gender_age struct<gender:string,age:int>,
    skills_score map<string,int>,
    depart_title map<string,array<string>>
)
clustered by (employee_id) into 2 buckets			--以employee_id分桶分两桶
row format delimited fields terminated by '|'
collection items terminated by ','
map keys terminated by ':';


-- 设置mapreduce的任务数量为2
set map.reduce.tasks=2;
set hive.enforce.bucketing=true; --启动分桶设置

insert overwrite table employee_id_buckets select * from employee_id;


-- 获取20%的数据
select * from employee_id_buckets tablesample ( 20 percent );
-- 获取前10行数据
select * from employee_id_buckets tablesample ( 10 rows );
--分桶抽样
select * from employee_id_buckets tablesample ( bucket 5 out of 6 on rand());

分桶抽样讲解:

假设当前分桶表,一共分了z桶!(当前示例中分了2桶)
x: 代表从当前的第几桶开始抽样(从第5个开始抽样)
0<x<=y
y: z/y 代表一共抽多少桶!(一共抽2/6桶)
y必须是z的因子或倍数!
怎么抽:将一桶分了z/y,抽总体的第x份(将每一桶分为3份,抽取第5份(就是第一桶的最后部分))

4.3.7、CTAS

create table ctas_student as select * from student;

4.3.8、CTE

create table cte_table as
	with
	t1 as (select * from student2 where age>25),
	t2 as (select * from t1 where name = 'xiaoming9'),
	t3 as (select * from student2 where age<25)
	select * from t2 union all select * from t3;
	
# (使用with查询)
with
	t1 as (select * from student2 where age>25),
	t2 as (select * from t1 where name = 'xiaoming9'),
	t3 as (select * from student2 where age<25)
select * from t2 union all select * from t3;

4.3.9、LIKE

创建下的表数据结构一致,无数据

	create table student_like like student;

4.3.10、export(导出)、import(导入)

export和import可用于两个hive实例之间的数据迁移。

  • export将表的数据和元数据信息一并导出到HDFS路径。

语法:
export table tablename to ‘export_target_path’

  • import将export导出的内容导入到hive。

语法:
import [ external ] table new_or_origunal_tablename from ‘source_path’ [ location ‘import_target_path’ ]

示例:

# 导出数据
export table 表名 to '/outstudentpt';			导出到hdfs文件系统

在这里插入图片描述

# 导入(相等于创建一个表)
use bigdata
import table studentpt from '/outstudentpt';

在这里插入图片描述

4.3.11、清空表数据

# 清空表数据
	truncate table 表名;

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

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

相关文章

动态网页的核心——JSP

文章目录1&#xff0c;JSP 概述2&#xff0c;JSP 小案例2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3&#xff0c;JSP 原理4&#xff0c;JSP 总结4.1 JSP的 缺点4.2技术的发展历程4.3JSP的必要性最后说一句1&#xff0c;JSP 概述 JSP&#xff08;全称…

IB数学/生物/化学/物理所需的教材有哪些

高中阶段的学习是迈向大学的重要步骤&#xff0c;涉及到的课程分为许多结构&#xff0c;其中最为常见的则是通过IB, AP和A-Level的学习&#xff0c;实现迈入国外大学的目的。 IB课程即国际文凭组织IBO&#xff08;International Baccalaureate Organization&#xff09;&#x…

「TCG 规范解读」规范结构

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

「TCG 规范解读」TCG 主规范-命令

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance,TCPA)所开发的规范。现在的规范都不是最终稿,都…

为什么需要学习shell、shell的作用

课程基于B站于超课程笔记 03 Shebang的正确玩法_哔哩哔哩_bilibili P1 shell的作用 P2 shell执行命令的流程 P3 Shebang的正确玩法 什么是shell及组成 shell概念 shelll组成 Shebang概念 /bin/sh /bin/bash一样&#xff0c;都是指向一个bash解释器 [rootlocalhost ~]#…

JVM篇之类加载与字节码技术

一.类文件结构 首先获得.class字节码文件 方法&#xff1a; 在文本文档里写入java代码&#xff08;文件名与类名一致&#xff09;&#xff0c;将文件类型改为.javajava终端中&#xff0c;执行javac X:…\XXX.java // HelloWorld 示例 public class HelloWorld {public stat…

IB课程体系及计分方式

IB课程体系及计分方式 在全球将近150个国家&#xff0c;超过4000个学校&#xff0c;有100万的IB学生。学生在IB体系中修读相同的教材&#xff0c;学生毕业时参加全球统一考试&#xff0c;试卷的命题及批阅均由IB总部直接统筹规划&#xff0c;全世界的IB学生学术水平因此得以统一…

面试了一个32岁的程序员,一个细节就看出来是培训班的····

首先&#xff0c;我说一句&#xff1a;培训出来的&#xff0c;优秀学员大有人在&#xff0c;我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配&#xff0c;是非常遗憾的事情。 最近&#xff0c;在网上看到这样一个留言&#xff0c;引发了程序员这个圈子不少的…

利用逻辑分析仪解析串口通讯数据

利用逻辑分析仪解析串口通讯数据&#x1f527;采用的是市面上最为广泛使用的USB逻辑分析仪: &#x1f4da;资料下载&#xff1a; 链接: https://pan.baidu.com/s/1c9lwWDbtJxaJED-kzSbiJg 提取码: 5vnr&#x1f528;测试工具为&#xff1a;Logic 2.4.6&#xff0c;也可以使用Pu…

华为OD机试题,用 Java 解【开放日活动】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

华为OD机试题,用 Java 解【求字符串中所有整数的最小和】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

【Linux】Linux根文件系统扩容

场景&#xff1a;根文件系统需要至少100GB的剩余空间&#xff0c;但是目前就剩余91GB。因此&#xff0c;我们需要对根文件系统进行扩容。# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs …

文献阅读 Improving Seismic Data Resolution with Deep Generative Networks

题目 Improving Seismic Data Resolution with Deep Generative Networks 使用深度生成网络提高地震数据分辨率 摘要 叠前数据的使用&#xff0c;通常可以来解决噪声迹线、覆盖间隙或不规则/不适当的迹线间距等问题。但叠前数据并不总是可用的。作为替代方案&#xff0c;叠后…

分布式锁实现原理与最佳实践

作者&#xff1a;秦泽涛 阿里云教育基座团队 在单体的应用开发场景中涉及并发同步时&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或同一个JVM内Lock机制来解决多线程间的同步问题。而在分布式集群工作的开发场景中&#xff0c;就需要一种更加高级的锁机制…

AI绘画第一步,安装Stable-Diffusion-WebUI全过程 !

别玩那些小孩子的玩意儿了&#xff0c;大人应该玩这些^_^&#xff01;我是真没想到&#xff0c;AI绘画已经进化到这种程度了。实在是太&#xff01;逼&#xff01;真! 了&#xff01;不上重马赛克都不敢贴图&#xff01;看了这些图&#xff0c;有没有心痒痒的&#xff1f;今天就…

逆向-还原代码之除法 (Interl 64)

除法和32位差不多&#xff0c;毕竟背后的数学公式是一样的。区别只是32位的乘法需要两个寄存器来存放大数相乘的结果&#xff0c;而64位的不需要&#xff0c;一个寄存器就能存下。所以在64位的环境下&#xff0c;多了右移32位这条指令&#xff0c;其他指令一样。 //code #incl…

升级Android Studio Electric Eel问题汇总

1.升级以后找不到java可执行程序 问题原因&#xff1a;升级后&#xff0c;Android Studio自带的java目录不再是根目录/jre&#xff0c;调整为一个新目录 Studio根目录/jbr 修改方法&#xff1a;1&#xff09;修改系统环境变量&#xff0c; JAVA_HOME调整为Studio下对应的java…

烟厂能耗控制管理系统_烟厂能源管理信息系统

烟厂也是能耗大厂&#xff0c;为了更好的让烟厂完成资源调配、成本核算、能耗统计等&#xff0c;需要建立一套有效的能源数据管理系统&#xff0c;对能源进行监测&#xff0c;自动获取能源信息&#xff0c;方便查看厂区能源实时情况。烟厂能耗控制管理系统是利用信息化技术手段…

java多线程(七)线程等待与唤醒

一、wait()、notify()、notifyAll()等方法介绍 在Object.java中&#xff0c;定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态&#xff0c;同时&#xff0c;wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用&#xff0…

阶段十:总结专题(第六章:缓存篇)

阶段十&#xff1a;总结专题&#xff08;第六章&#xff1a;缓存篇&#xff09;Day-第六章&#xff1a;缓存篇1. Redis 数据类型**String****List****Hash****Sorted Set**2. keys 命令问题3. 过期 key 的删除策略4. Redis 持久化**AOF 持久化****AOF 重写****RDB 持久化****混…