Apache Hive入门

news/2024/3/29 17:30:51/文章来源:https://blog.csdn.net/qq_38591577/article/details/129187730

文章目录

  • 一、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 aswitht1 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查询)
witht1 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.luyixian.cn/news_show_75171.aspx

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

相关文章

本地新项目上传到git的详细步骤

前提&#xff1a;你本地的项目目录里要记得添加.gitignore忽略文件&#xff0c;免得把一些无用的文件提交&#xff0c;内容如下&#xff0c;可直接粘贴&#xff1a; # Created by .ignore support plugin (hsz.mobi) ### Java template # Compiled class file *.class# Log fi…

2023-02-28 mmap的原理及使用-思考

摘要: 最近在使用mmap解决数据库内存占用损耗过高导致OOM的问题, 不得不说在有些场景下mmap是非常有用. 本文主要涉及一些对mmap的思考. mmap本身的思考: mmap和文件系统的交互规则是什么mmap中给进程虚拟内存映射的文件上的部分,是什么? 为什么是页缓存? 有没有文件缓存?…

华为OD机试题,用 Java 解【连续字母长度】问题

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

百度CTO王海峰:深度学习平台+大模型,夯实产业智能化基座

2月27日&#xff0c;中国人工智能学会首届智能融合产业论坛在成都顺利举办。本届论坛由中国人工智能学会&#xff08;CAAI&#xff09;主办&#xff0c;中国人工智能学会智能融合专委会、百度公司、深度学习技术及应用国家工程研究中心和电子科技大学联合承办。中国工程院多名院…

企业级React Hooks实战开发指南

背景 大家有没有发现一个问题&#xff0c;我们从任何招聘网站上看到关于React(现在90%都是React Hooks)开发的招聘岗位薪资一定都比其他前端岗位的高&#xff0c;那是什么原因呢&#xff1f;本质的原因是&#xff1a;React学习成本高&#xff0c;导致学习的人少&#xff0c;然…

跟对象介绍十个常用的 Python 内置函数,她夸了我一整天

内置函数是什么 了解内置函数之前&#xff0c;先来了解一下什么是函数 将使用频繁的代码段进行封装&#xff0c;并给它起一个名字&#xff0c;当我们使用的时候只需要知道名字就行 函数就是一段封装好的、可以重复使用的代码&#xff0c;函数使得我们的程序更加简洁、模块化&a…

Goframe快速创建项目,并使用Cli工具创建dao、service、logic

GoFrame项目创建与Cli工具创建1.项目创建2.Mysql数据库配置3.Cli工具dao自动生成4.业务模型须知5.Cli工具service/logic自动生成 - 接口6.Controller/Api创建1.项目创建 官网 - 项目创建-init 开发文档 - 目录介绍 官网 - 示例项目 1.gf init 项目名 &#xff08;创建项目…

Java及JVM简介

世界上没有最好的编程语言&#xff0c;只有最适用于具体应用场景的编程语言 懂得JVM内部的内存结构、工作机制&#xff0c;是设计高扩展性应用和诊断运行时问题的基础&#xff0c;也是Java工程师进阶的必备能力。 java介绍 java是目前应用最为广泛的软件开发平台之一。随着…

C++---最长上升子序列模型---登山(每日一道算法2023.2.28)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度" 和 “最长上升子序列模型—怪盗基德的滑翔翼” 的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 五一到了&#xff0c;ACM队组织大家去登山观光&#xff0c;队员们发现山上一共有N个景…

复习知识点八之数组

目录 数组 静态初始化练习 打印 索引 数组遍历 练习1:遍历数组并求和 练习2:统计个数 练习3:变化数据​编辑 数组的动态初始化 数组的动态初始化和静态初始化的区别​编辑 数组的常见问题 数组常见操作 练习1:求最值 ​编辑 练习2 : 遍历数组求和 练习3: 练习4: 数…

值得收藏!适合小微企业的万元数字化攻略!

编者按&#xff1a;小微企业数字化之路困难重重&#xff1f;看看这款全新的全面数字化方案&#xff0c;低成本、部署效率、免安装、免维护、数据安全&#xff0c;小微企业的数字化福音&#xff01;关键词&#xff1a;低成本&#xff0c;开箱即用&#xff0c;免安装免维护&#…

SpringMVC使用 redis 实现缓存

简介 SpringMVC 中也可以将缓存标签和 redis 结合起来使用&#xff0c;其实此时缓存没有起作用&#xff0c;只是通过缓存的那几个注解来操作 redis 而已&#xff1b;SpringMVC 中整合 redis 比较麻烦的是注意版本冲突的问题&#xff0c;如下是官网有关于版本的要求 https://d…

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录 一、引言 二、设备树插件格式 三、实验说明 四、实验准备 4.1 通过内核工具编译设备树插件 五、实验效果 5.1 uboot加载 5.2 加载RGB驱动 一、引言 Linux4.4以后引入了动态设备树&#xff08;Dynamic DevicesTree&#xff09;&#xff0c;这里翻译位“设备树插件…

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…

SpringMVC源码:HandlerMapping加载1

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

跨设备文件传输工具横评

文章目录对比QQ微信SnapDropLocalSendIntelUnisonLANDropTailscaleAirDroidSendAnywhere参考文献对比 传输速度测试条件大致相同&#xff0c;文件大小约为 100 MB 工具优点缺点传输速度备注QQ支持断点续传不要求同一局域网需要安装1.81 MB/s微信方便需要安装不支持大文件传完还…

ROS1学习笔记:ROS中的坐标管理系统(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;ROS中的坐标系管理系统 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、机器人中的坐标变换二、TF功能包三、小海龟跟随实验3.1 启动实验3.2 查看当前的TF树3.3 坐标相对位置可视化3.3.1 tf_echo3.3.2 rviz一、机器人中的坐标变换…

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Spring Boot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引用了一个…

Maven高级操作,别说你不知道

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; &#x1f916; 一、聚合 &#x1f47b; 1、作用&#xff1a; 用于快速构建maven工程&#xff0c;一次性构建多个模块/项目 &am…

【人脸识别】DDL:数据分布知识蒸馏思想,提升困难样本(遮挡、低分辨率等)识别效果

论文题目&#xff1a;《Improving Face Recognition from Hard Samples via Distribution Distillation Loss》 论文地址&#xff1a;https://arxiv.org/pdf/2002.03662v3.pdf 代码地址&#xff1a;https://github.com/HuangYG123/DDL 1.前言及相关工作 Large facial variatio…