HIVE技术

server/2025/1/15 8:56:35/

本文章基于黑马免费资料编写。

hive_3">hive介绍

  1. 简介
    在这里插入图片描述
  2. hive架构
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

hive_14">hive需要启动的配置

  1. 执行元数据库初始化命令 使用hive必须启动的服务
 ./schematool -initSchema -dbType mysql -verbos
  1. 启动 Hive
    创建一个 hive 的日志文件夹
mkdir /export/server/hive/logs

启动元数据管理服务

nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &

启动客户端

  • Hive Shell 方式(可以直接写 SQL ): bin/hive
  • Hive ThriftServer 方式(不可直接写 SQL ,需要外部客户端链接使用):
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 & 
  • 用beeline连接:!connect jdbc:hive2://node1:10000 账号hadoop 密码无

数据库操作

  1. 创建数据库
#创建数据库
create database if not exists 数据库名;
#使用数据库
use 数据库名;
  1. 查看数据库详细信息
desc database 数据库名;

在这里插入图片描述数据库本质上就是在 HDFS 之上的文件夹。
默认数据库的存放路径是 HDFS 的: /user/hive/warehouse 内

  1. 创建数据库并指定 hdfs 存储位置
#指定存储位置
create database 数据库名 location 'hdfs文件路径';
#例如
create database myhive2 location '/myhive2';
  1. 删除数据库
#删除一个空数据库,如果数据库下面有数据表,那么就会报错
drop database myhive;
#强制删除数据库,包含数据库下面的表一起删除
drop database myhive2 cascade;

数据表操作

  • 创建数据表语法
    在这里插入图片描述
    • EXTERNAL ,创建外部表
    • PARTITIONED BY , 分区表
    • CLUSTERED BY ,分桶表
    • STORED AS ,存储格式
    • LOCATION ,存储位置

  • 数据类型
    红色为常见的数据类型
    在这里插入图片描述

  1. 创建数据表
CREATE TABLE test(
id INT,
name STRING,
gender STRING
);
  1. 删除表
DROP TABLE table_name;

hive_94">hive表类型

  • 内部表
  • 外部表
  • 分区表
  • 分桶表
  1. 内部表
CREATE TABLE table_name ...... 
#例如
create table if not exists stu(id int,name string);

未被 external 关键字修饰的即是内部表, 即普通表。 内部表又称管理表 , 内部表数据存储的位置由
hive.metastore.warehouse.dir 参数决定(默认: /user/hive/warehouse ),删除内部表会直接删除元数据( metadata )及存储数据,因此内部表不适合和其他工具共享数据。

  1. 外部表
CREATE EXTERNAL TABLE table_name ......LOCATION...... 
#例如
CREATE EXTERNAL TABLE stu(id int,name string) LOCATION '/myhive';

external 关键字修饰的即是外部表, 即关联表。
外部表是指表数据可以在任何位置,通过 LOCATION 关键字指定。 数据存储的不同也代表了这个表在理念是并不是Hive 内部管理的,而是可以随意临时链接到外部数据上的。所以,在删除外部表的时候, 仅仅是删除元数据(表的信息),不会删除数据本身。

内部表操作

在这里插入图片描述

  • 创建一个内部表并插入数据,查看数据存储位置
create database if not exists myhive;
use myhive;
create table if not exists stu(id int,name string);
insert into stu values (1,"zhangsan"), (2, "wangwu");
select * from stu;

在这里插入图片描述

  • 自行指定分隔符
create table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t';
#解释
row format delimited fields terminated by '\t' :表示以 \t 分隔

在这里插入图片描述

  1. 其它创建内部表的形式
#除了标准的 CREATE TABLE table_name 的形式创建内部表外
#基于查询结果建表
CREATE TABLE table_name as 
#例如
create table stu3 as select * from stu2;#基于已存在的表结构建表
CREATE TABLE table_name like
#例如
create table stu4 like stu2;#也可以使用 DESC FORMATTED table_name ,查看表类型和详情
DESC FORMATTED stu2;
  1. 删除内部表
DROP TABLE table_name
#例如
drop table stu2;

在这里插入图片描述

外部表操作

外部表,创建表被 EXTERNAL 关键字修饰,从概念是被认为并非 Hive 拥有的表,只是临时关联数据去使用。
创建外部表也很简单,基于外部表的特性,可以总结出: 外部表 和 数据 是相互独立的, 即:

  • 可以先有表,然后把数据移动到表指定的 LOCATION 中

  • 也可以先有数据,然后创建表通过 LOCATION 指向数据

  • 先有表再有数据


#1. 在 Linux 上创建新文件, test_external.txt,用'\t'分割
vim test_external.txt
#2.先创建外部表,然后移动数据到 LOCATION 目录
#首先检查: 确认不存在 /tmp/test_ext1 目录
hadoop fs -ls /tmp 
#创建外部
create external table test_ext1(id int, name string) row format delimited fields
terminated by ‘\t’ location ‘/tmp/test_ext1’;
#空结果,无数据
select * from test_ext1
#上传数据:
hadoop fs -put test_external.txt /tmp/test_ext1/
#即可看到数据结果
select * from test_ext1 
  • 先有数据再有表
#在hdfs中创建文件夹
hadoop fs -mkdir /tmp/test_ext2
#将linux中的txt数据文件上传到hdfs中
hadoop fs -put test_external.txt /tmp/test_ext2/
#创建指定位置的外部表
create external table test_ext2(id int, name string) row format delimited fields terminated by ‘\t’ location ‘/tmp/test_ext2’;
#查询数据
select * from test_ext2;

在这里插入图片描述

内外部表切换

desc formatted stu;

在这里插入图片描述

#内部表转外部表
alter table stu set tblproperties('EXTERNAL'='TRUE');
#外部表转内部表
alter table stu set tblproperties('EXTERNAL'='FALSE');

要注意: (‘EXTERNAL’=‘FALSE’) 或 (‘EXTERNAL’=‘TRUE’) 为固定写法,区分大小写!!!

数据加载 - LOAD 语法

在这里插入图片描述
在这里插入图片描述

#建表,comment为加注释
CREATE TABLE myhive.test_load(
dt string comment ' 时间(时分秒) ',
user_id string comment ' 用户 ID',
word string comment ' 搜索词 ',
url string comment ' 用户访问网址 '
) comment ' 搜索引擎日志表 ' ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t';#加载数据,注意,基于 HDFS 进行 load 加载数据,源数据文件会消失(本质是被移动到表所在的目录中)
load data local inpath '/home/hadoop/search_log.txt' into table myhive.test_load;
load data inpath '/tmp/search_log.txt' overwrite into table myhive.test_load;

数据加载 - INSERT SELECT 语法

除了 load 加载外部数据外,我们也可以通过 SQL 语句,从其它表中加载数据。

INSERT [OVERWRITE | INTO] TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT
EXISTS]] select_statement1 FROM from_statement;
#将SELECT 查询语句的结果插入到其它表中,被 SELECT 查询的表可以是内部表或外部表。
INSERT INTO TABLE tbl1 SELECT * FROM tbl2;
INSERT OVERWRITE TABLE tbl1 SELECT * FROM tbl2;

数据加载 - 两种语法的选择

对于数据加载,我们学习了: LOAD 和 INSERT SELECT 的方式,那么如何选择它们使用呢?

  • 数据在本地
    • 推荐 load data local 加载
  • 数据在 HDFS
    • 如果不保留原始文件: 推荐使用 LOAD 方式直接加载
    • 如果保留原始文件: 推荐使用外部表先关联数据,然后通过 INSERT SELECT 外部表的形式加载数据
  • 数据已经在表中
    • 只可以 INSERT SELECT

hive___insert_overwrite__247">hive 表数据导出 - insert overwrite 方式

  • hive 表中的数据导出到其他任意目录,例如 linux 本地磁盘,例如 hdfs ,例如 mysql 等等
#语法
insert overwrite [local] directory ‘path’ select_statement1 FROM from_statement;
#将查询的结果导出到本地 - 使用默认列分隔符
insert overwrite local directory '/home/hadoop/export1' select * from test_load ;
#将查询的结果导出到本地 - 使用列分隔符
insert overwrite local directory '/home/hadoop/export2' row format delimited fields terminated by '\t'
select * from test_load;
#将查询的结果导出到HDFS上(不带local关键字)
insert overwrite directory '/tmp/export' row format delimited fields terminated by '\t' select * from test_load;

hive___hive_shell_260">hive 表数据导出 - hive shell

#基本语法:( hive -f/-e 执行语句或者脚本 > file )
bin/hive -e "select * from myhive.test_load;" > /home/hadoop/export3/export4.txt
bin/hive -f export.sql > /home/hadoop/export4/export4.txt

注意:推荐将外部表加载到内部表管理

分区表

在这里插入图片描述
在这里插入图片描述

#基本语法 
create table tablename(...) partitioned by ( 分区列 列类型 , ......) row format delimited fields terminated by '';
#创建单分区表
create table score(s_id string,c_id string,s_score int) partitioned by ( month string) row format delimited fields terminated by '\t';
#创建多分区表
create table score(s_id string,c_id string,s_score int) partitioned by (year string,month string, day string) row format delimited fields terminated by '\t';
#加载数据到分区表中
load data local inpath '/export/server/hivedatas/score.txt' into table score partition(month='202501')
#加载数据到一个多分区表中
load data local inpath '/export/server/hivedatas/score.txt' into table score partition(year = '2025',month = '01',day='06')
  • 分区表的使用
#查看分区
show partitions score;
#添加一个分区
alter table score add partition(month='202506')
#同时添加多个分区
alter table score add partition(month='202501') partition(month='202502')
#删除分区
alter table score drop partition(month = '202501')

在这里插入图片描述


http://www.ppmy.cn/server/158504.html

相关文章

w~大模型~合集27

我自己的原文哦~ https://blog.51cto.com/whaosoft/12898045 #vLLM~2 作者尽量少涉及对源码本身的解读,把源码中的信息总结出来,配合图例做整体介绍。 大家好,这段时间精读了一下vLLM源码实现,打算开个系列来介绍它的源码&…

[Qt]常用控件介绍-输入类控件-QLineEdit、QTextEdit、QComboBox控件

目录 1.Line Edit控件 属性 核心信号 Demo:XX软件登录 正则表达式-验证器 Demo:验证器与按钮的配合 Demo:验证两次输入的密码一致 Demo:显示与隐藏密码按钮 2.Text Edit控件 属性 核心信号 几个信号的演示操作 3.C…

求矩阵不靠边元素之和(PTA)C语言

求矩阵的所有不靠边元素之和&#xff0c;矩阵行的值m从键盘读入(2<m<10)&#xff0c;调用自定义函数Input实现矩阵元素从键盘输入&#xff0c;调用Sum函数实现求和。(只考虑float型&#xff0c;且不需考虑求和的结果可能超出float型能表示的范围)。 函数接口定义&#x…

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…

Word表格批量提取数据到Excel,批量提取,我爱excel

Word表格批量提取数据到Excel&#xff0c;Word导出到Excel - 我爱Excel助你高效办公 在日常办公中&#xff0c;Word表格常常用于记录和整理数据&#xff0c;但将这些数据从Word提取到Excel&#xff0c;特别是当涉及多个文件时&#xff0c;常常让人头疼。如果你经常需要将多个W…

从Vant图标的CSS文件提取图标文件

文章目录 环境背景基础用法使用图片URL&#xff1a;自定义图标 问题分析步骤步骤1&#xff1a;解码步骤2&#xff1a;提取图标步骤3&#xff1a;批量提取图标完整代码和用法 总结参考 环境 Windows 11Python 3.13.1Vant 4.9.15NPM 11.0.0 背景 我需要一些图标文件&#xff0…

深入解析 ZooKeeper:分布式协调服务的原理与应用

1.说说 Zookeeper 是什么&#xff1f; ZooKeeper 是一个开源的分布式协调服务&#xff0c;由 Apache Software Foundation 开发维护。它为构建分布式应用程序提供了一套简单且高效的协调接口。ZooKeeper 的设计目的是为了简化分布式系统中常见的任务&#xff0c;例如命名、配置…

【centos】校时服务创建

在 CentOS 下安装校时服务客户端&#xff08;NTP 客户端&#xff09;可以按照以下步骤进行&#xff1a; 安装 NTP 软件包&#xff1a; 打开终端并运行以下命令来安装 NTP 客户端&#xff1a; sudo yum install ntp 启动 NTP 服务&#xff1a; 安装完成后&#xff0c;启动 NT…