Hive 库表相关操作

news2024/12/27 13:49:07

1、Hive内部表和外部表

1.内部表:未被external修饰;外部表:被external修饰。

区别:

(1)内部表数据由Hive自身管理,外部表数据由HDFS管理;

(2)内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse), 外部表数据的存储位置由自己制定;

(3)删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;

对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

2.Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

  需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否符合schema的,hive 遵循的是 schema on read(读时模式),只有在读的时候hive才检查、解析具体的数据字段、schema。

  读时模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。

写时模式的优

势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。

2、库表操作

1、库操作

show databases;

hive 的表存放位置模式是由 hive-site.xml 当中的一个属性指定的,默认是存放在该配置文件设置的路径下,也可在创建数据库时单独指定存储路径。

<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>

1、创建数据库

create database if not exists test_001;
use test_001;

创建数据库并指定位置
create database test_002 location '/user/hive/warehouse/test.db';

2、删除数据库

删除一个空数据库,如果数据库下面有数据表,那么就会报错

drop database test_003;
强制删除数据库,包含数据库下面的表一起删除(请谨慎操作)
drop database test_003 cascade;

2、表操作

1、建语句格式说明

[]里的属性为可选属性,不是必须的,但是如果有可选属性,会使 sql 语句的易读性更好,更标准与规范。

例如:[comment '字段注释信息'][comment '表的描述信息']等,[external]属性除外

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name(      
column_name data_type [comment '字段注释信息']
column_name data_type [comment '字段注释信息']
...
[comment '表的描述信息']                               
[PARTITIONED BY(column_name data_type, ...)]
[CLUSTERED BY (column_name, column_name, ...)
[SORTED BY(col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format] 
[STORED AS file_format]
[LOCATION '指定表在 hdfs 中的存储路径']  
)

1. CREATE TABLE

创建一个指定名字的表,如果相同名字的表已存在,则抛出异常提示:表已存在,使用时可以使用IF NOT EXISTS语句来忽略这个异常。

如果创建的表名已存在,则不会再创建,也不会抛出异常提示:表已存在。否则则自动创建该表。

2. EXTERNAL

顾名思义是外部的意思,此关键字在建表语句中让使用者可以创建一个外部表,如果不加该关键字,则默认创建内部表。

外部表在创建时必须同时指定一个指向实际数据的路径(LOCATION),Hive在创建内部表时,会将数据移动到数据仓库指向的路径;

若创建外部表,仅记录数据所在的路径,不对数据的位置作任何改变。

内部表在删除后,其元数据和数据都会被一起删除。

外部表在删除后,只删除其元数据,数据不会被删除。

3. COMMENT

用于给表的各个字段或整张表的内容作解释说明的,便于他人理解其含义。

4. PARTITIONED BY

区分表是否是分区表的关键字段,依据具体字段名和类型来决定表的分区字段。

5. CLUSTERED BY

依据column_name对表进行分桶,在 Hive 中对于每一张表或分区,Hive 可以通过分桶的方式将数据以更细粒度进行数据范围划分。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

6. SORTED BY

指定表数据的排序字段和排序规则,是正序还是倒序排列。

7. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

指定表存储中列的分隔符,这里指定的是'\t',也可以是其他分隔符。

8. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE

指定表的存储格式,如果文件数据是纯文本格式,可以使用STORED AS TEXTFILE,如果数据需要压缩,则可以使用STORED AS SEQUENCEFILE。

9. LOCATION

指定 Hive 表在 hdfs 里的存储路径,一般内部表(Managed Table)不需要自定义,使用配置文件中设置的路径即可。

如果创建的是一张外部表,则需要单独指定一个路径。

2、Hive创建表的三种方式

1. 使用create table语句创建表

例子:

create table if not exists `t_student`(

id int,

s_name string,

s_age int)

partitioned by(date string)

row format delimited fields terminated by '\t';

2. 使用create table ... as select...语句创建表

例子:

create table sub_student as select * from t_student;

使用 create table ... as select ...语句来创建新表sub_student,此时sub_student 表的结构及表数据与 t_student 表一模一样,相当于直接将 t_student 的表结构和表数据复制一份到 sub_student 表。

注意:

(1). select 中选取的列名(如果是 * 则表示选取所有列名)会作为新表 sub_student 的列名。

(2). 该种创建表的方式会改变表的属性以及结构,例如不能是外部表,只能是内部表,也不支持分区、分桶。

如果as select后的表是分区表,并且使用select *,则分区字段在新表里只是作为字段存在,而不是作为分区字段存在。

在使用该种方式创建时,create 与 table 之间不能加 external 关键字,即不能通过该种方式创建外部目标表,默认只支持创建内部目标表。

(3). 该种创建表的方式所创建的目标表存储格式会变成默认的格式textfile。

3.使用like语句创建表

例子:

create table sub1_student like t_student;

注意:

(1). 只是将 t_student 的表结构复制给 sub1_student 表。

(2). 并不复制 t_student 表的数据给 sub1_student 表。

(3). 目标表可以创建为外部表,即:

create external table sub2_student like t_student;

3、建表和数据加载实战

1、准备文件

E:\hadoop\local\t_user.txt

1,Tom
2,Bob
3,Lily
4,Alice

2、建库 建表

create database test2;

use test2;

select current_database();

create table test_user(
    id int,
     name string
   )
 row format delimited
 fields terminated by ','
lines terminated by '\n'
stored as textfile;

可以看到库表已经建立成功

http://localhost:9870/explorer.html#/user/hive/warehouse/test2.db

3、文件导入的几种方式

1、使用hdfs命令将本地数据文件上传至hdfs中我们创建的数据库下面的表目录下面:

到hadoop sbin下执行

hdfs dfs -put E:\hadoop\local\t_user.txt /user/hive/warehouse/test2.db/test_user

这个目录我们可以从HDFS ui上找到我们的表对应的目录直接拷贝:

上传好之后我们刷新ui界面,可以看到已上传的数据文件:

回到hive客户端查询数据:

select * from test_user;

2、直接在hive客户端将linux系统本地文件上传至hive中:

load data local inpath 'E:\hadoop\local\t_user.txt' into table test_user;

hive> load data local inpath '/root/t_user.txt' into table test_user;

#在使用metastore的方式启动hive服务时,如果你是从hive客户端linux文件系统中上传文件,就加上local,如果是从hdfs的文件系统中上传数据文件,就不需要加local,inpath后面的路径参数就是你要上传的文件的路径,这个路径可以是相对路径也可以是绝对路径,但是如果你写相对路径,要特别注意这个相对路径是相对于你当前进入hive时所在的位置,也就是你从哪个路径的位置登创建的hive session,那么相对路径就是从这个位置算起的。
#如果使用hiveserver2/beeline的方式启动hive服务,那么上面的语句中的local指的就是hive服务端的文件系统了,对应的inpath后面的路径也应该是hive服务端中的文件路径。
#load data local inpath '/root/t_user.txt' overwrite into table test_user;
#如果表是已经存在的,且表中有数据,那么你在上传数据文件时可以加上overwrite来表示重写表中的数据,如果不写overwrite,则上传的数据会在表中原数据基础上进行追加。

由于这里我没有加上overwrite参数,所以在使用了方式一导入数据之后,这次再导入数据就相当于是追加数据:

刷新ui也可以看到多了一个copy_1的文件,因为两次上传的文件名相同:

上述两种方式中,如果是将linux文件系统中的数据上传至hive时,本质是将linux文件系统中的数据文件拷贝一份放在hdfs的表目录下面,如果是将hdfs文件系统中的数据文件上传至hive时,本质是将hdfs文件系统中的该数据文件移动至hdfs的表目录下面。注意,一个是拷贝,一个是移动。

3、将其他表中的数据导入至目标表中

上述两种方式中一直在使用的是test_user这个表,现在再建一个新表

create table test_user_new(
    id int,
     name string
   )
 row format delimited
 fields terminated by ','
lines terminated by '\n'
stored as textfile;

hive 然后将test_user表中的数据插入到test_user_new表中:

insert into table test_user_new select * from test_user;

这里还支持:不一一解释了

  • 同时向多张表中插入数据
  • 将表中的特定列数据插入至另一个表中
  • 克隆表数据

会将test_user表结构及表中的数据全部克隆过来

create table test_user_clone as select * from test_user;

  • 克隆表结构

使用like关键字,只会克隆表结构,不会将数据也克隆过来

create table test_user_structure like test_user;

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

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

相关文章

ESP32(Micro Python) LVGL 传感器数值显示

本程序用于显示SR04超声波传感器和BMP280气压温度传感器的读数。由于高度数值类型不符合要求&#xff0c;BMP280改为显示气压和温度值。气压值分两部分显示&#xff0c;分别为千帕值-100&#xff08;避免超出表盘显示范围&#xff09;和千帕值的两位小数。由于标签不能显示动态…

在Mybatis执行插入数据时,如何将Date类型字段设置为“yyyy-MM-dd”的格式

1、问题描述 使用mybatis新增插入一条数据到MySQL数据库时&#xff0c; 其中实体类对象的一个属性”hiredate“的类型是日期类型Date&#xff0c; 此属性在数据库中对应的字段“hiredate”类型也是日期Date类型&#xff0c; 但是在数据库中要求“hiredate”字段的字段值为“yy…

瑞萨RA4M2 基于CAN总线的UDS诊断升级MCU工具 /bootloader/UDS诊断/14229/15765

基于can总线的UDS软件升级 最近学习UDS诊断协议&#xff08;ISO14229&#xff09;&#xff0c;是一项国际标准&#xff0c;为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求&#xff0c;并没有设计通信机制。ISO14229仅对应用层和会话层做出了…

【SpringCloud入门】-- 认识微服务

目录 1. 什么是微服务&#xff1f; 2. 微服务的优势&#xff1f; 3. 单体架构&#xff0c;分布式架构&#xff0c;微服务架构的区别以及优缺点&#xff1f; 4. SpringCloud和Spring Cloud Alibaba是什么&#xff1f; 5. SpringCloud和SpringCloudAlibaba的区别&#xff1f…

apple pencil二代值不值得买?口碑好的电容笔排行榜

事实上&#xff0c;苹果Pencil与市场上普通的电容笔最大的区别就是在重量和压感上。苹果pencil拥有着独特的重力压感&#xff0c;可以很好运用于绘画上&#xff0c;但是&#xff0c;随着苹果Pencil的价格一直高居不下&#xff0c;而平替电容笔各种性能的不断提高&#xff0c;苹…

Vue中如何进行3D场景展示与交互(如Three.js)

Vue中如何进行3D场景展示与交互&#xff08;如Three.js&#xff09; 随着WebGL技术的发展&#xff0c;越来越多的网站开始使用3D场景来展示产品、游戏等内容。在Vue中&#xff0c;我们可以使用第三方库Three.js来实现3D场景的展示与交互。本文将介绍如何在Vue中使用Three.js来…

和 if else说再见,SpringBoot 这样做参数校验才足够优雅!

1. 概述 当我们想提供可靠的 API 接口&#xff0c;对参数的校验&#xff0c;以保证最终数据入库的正确性&#xff0c;是 必不可少 的活。比如下图就是 我们一个项目里 新增一个菜单校验 参数的函数&#xff0c;写了一大堆的 if else 进行校验&#xff0c;非常的不优雅&#xf…

语音验证码短信原理和应用场景分析

引言 随着移动互联网的快速发展&#xff0c;短信验证码成为了许多应用和服务中常用的身份验证方式。然而&#xff0c;有时候用户可能由于各种原因无法接收到短信验证码&#xff0c;或者对于文字验证码不够方便或友好。 为了解决这些问题&#xff0c;语音验证码短信API 应运而…

【论文精读ACL_2021】Prefix-Tuning: Optimizing Continuous Prompts for Generation

【论文精读ACL_2021】Prefix-Tuning: Optimizing Continuous Prompts for Generation 0、前言Abstract1 Introduction2 Related Work2.1 Fine-tuning for natural language generation.2.2 Lightweight fine-tuning2.3 Prompting.2.4 Controllable generation. 3 Problem State…

Python做数据分析需要学什么?

下面分别从这四个方面来带大家学习数据分析&#xff1a; 第一&#xff0c;做数据分析要精通Python吗&#xff1f;第二&#xff0c;数据分析流程是什么&#xff1f;学什么&#xff1f;第三&#xff0c;如何培养数据分析思维&#xff1f;第四&#xff0c;数据分析书籍推荐 一、…

关于linux服务器上生成的图片中文字为的乱码问题

一、功能描述 linux服务器后端生成图表&#xff08;使用了canvas和echarts&#xff09;&#xff0c;并将生成的图片发送到企业微信群里。 二、出现的问题 生成的图表中文展示不出来&#xff0c;是乱码。错误图表展示如下&#xff1a; 三、 文字乱码出现的原因 linux服务器没有…

git在windows及linux(源码编译)环境下安装

git在windows及linux(源码编译)环境下安装 环境信息: 系统版本:CentOS Linux release 7.9.2009 (Core) git指令安装: yum install -y git 一、git在windows下安装 下载地址:https://git-scm.com/ 默认安装即可 验证 git --version 二、git在linux下安装 下载地址…

电子标签服务器搭建说明文档

一、安装运行环境 1.安装jdk 运行JDK_1.8.0_64bit.exe程序,可自定义安装路径 ​ 2.配置环境变量 择计算机图标&#xff0c;鼠标右键选择属性 ​ 选择高级系统设置&#xff0c;在系统属性中找到环境变量 ​ 在系统变量中新建JAVA_HOME环境变量&#xff0c;变量值为jdk的安装路…

跨域请求!!!

1.见过的请求类型都有哪些 getpostputdeleteoptions 和跨域相关的请求头 2.什么是跨域 当主机、域名、端口有任何一个不一致的时候&#xff0c;会出现跨域 3.跨域只有在哪里会出现 浏览器里出现了&#xff0c;它是浏览器的一个行为 4.为什么有跨域 为了安全不同域名之间…

系统编程(3):进程

文章目录 一、概念1.1 什么是进程&#xff1f;1.2 进程ID1.3 进程间通信1.4 进程的三种态的转换 二、进程控制2.1 创建进程函数&#xff1a;fork函数2.1.1 获得pid函数写代码&#xff1a;方式一&#xff1a;最简单的方式二&#xff1a;加入while&#xff08;1&#xff09;死循环…

基于Arduino的LED显示屏驱动实现

基于Arduino的LED显示屏驱动实现可以通过使用Arduino板上的数字引脚和相关库来控制LED显示屏的亮灭和显示效果。LED显示屏加载不出图像怎么办&#xff1f; 下面是基于Arduino的LED显示屏驱动实现的详细介绍&#xff1a; 硬件准备&#xff1a; Arduino开发板&#xff1a;可以使用…

ROS中 mpc_local_planner 局部路径规划器参数配置文件中参数含义

mpc_local_planner与我们比较熟悉的teb_local_planner出自同一研究所&#xff08;多特蒙德大学-控制理论与系统工程研究所&#xff09;&#xff0c;所以参数配置文件中的参数有很多相似之处&#xff0c;很多参数的含义也是相同的&#xff0c;所以熟悉teb_local_planner的参数含…

亚马逊认证考试系列 - 知识点 - 安全组介绍

AWS的安全组是一种虚拟防火墙&#xff0c;可以用于控制进入和离开AWS虚拟私有云(VPC)的流量。安全组是一种网络访问控制列表(NACL)的补充&#xff0c;因为安全组是在实例级别上进行管理的&#xff0c;而NACL是在子网级别上进行管理的。 AWS的安全组可以通过以下方式保护您的资源…

自然语言处理: 第一章N-Gram

一. 理论基础 定义: 语言模型在wiki的定义是统计式的语言模型是一个几率分布&#xff0c;给定一个长度为 m 的字词所组成的字串 W1 , W2 &#xff0c; &#xff0c;Wn &#xff0c;派几率的字符串P(S) P(W1 , W2 , &#xff0c;Wn &#xff0c; )而其中由条件概率公式我们可以…

风景类Midjourney prompt提示词

稳定输出优美风景壁纸的Midjourney prompt提示词。 1\在夏夜&#xff0c;有淡蓝色的星空&#xff0c;海边&#xff0c;流星&#xff0c;烟花&#xff0c;海滩上全是蓝色的玫瑰和绿色的植物&#xff0c;由Ivan Aivazovsky和Dan Mumford&#xff0c;趋势在cgsociety&#xff0c;…