Hive 操作基础(进阶篇☝️)

ops/2024/11/8 13:49:14/

Hive 入门操作

创建表

EXTERNAL,创建外部表
PARTITIONED BY, 分区表
CLUSTERED BY,分桶表
STORED AS,存储格式
LOCATION,存储位置
......,

数据类型

内部表

创建普通内部表: create table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型...) [row format delimited fields terminated by '指定分隔符'];

删除内部表: drop table 内部表名;       注意: 删除mysql中元数据同时也会删除hdfs中存储数据

修改表名: alter table 旧表名 rename to 新表名;

修改表字段名称和类型: alter table 表名 change 旧字段名 新字段名 新字段类型;

修改表之添加字段(列): alter table 表名 add columns (字段名 字段类型);

修改表之替换字段(列):alter table 表名 replace columns (字段名 字段类型);

查看所有表: show tables;

查看指定表基本信息: desc 表名; 

查看指定表扩展信息: desc extended 表名;

查看指定表格式信息: desc formatted 表名;

查看指定表建表语句: show create table 表名;  

-- 创建内部表方式1: create table if not exists 表名(字段名 字段类型,字段名 字段类型);
create table if not exists stu (id int,name string,age int);-- 查看表信息
desc stu; -- 查看列数据.
desc formatted stu; -- 查看表信息. Table Type: MANAGED_TABLE [内部表]-- 方式2: 复制表结构
create table if not exists stu2 like stu;
desc formatted stu2; -- 查看表信息. todo Table Type: MANAGED_TABLE [内部表]-- 方式3: 复制表结构和数据
-- 为了演示复制数据,临时插入数据到stu表
insert into stu values(1,'tom',18),(2,'jerry',18),(3,'rese',18),(4,'jack',18);
create table stu3 as select * from stu;-- truncate 清空表数据
truncate table stu3;
select * from stu3; -- 空空如也-- 删除表 drop -- 内部表会删除元数据和hdfs上的文件数据.
drop table stu;
select * from stu;-- Table not found 'stu' [元数据库(mysql)中没有记录stu表]

 外部表

创建外部表: 
create external table [if not exists] 内部表名(
字段名 字段类型 , ...
 )...;


复制外部表: create table 表名 as select 语句; 
复制表结构: create table 表名 like 存在的表名;

删除外部表: drop table 外部表名;
    
查看表格式化信息: desc formatted 表名; 

注意: 外部表不能使用truncate关键字清空数据

use db1;-- 创建外部表
create external table if not exists t_user (id int,name string,age int);-- 查看表结构
desc formatted t_user; -- todo Table Type: EXTERNAL_TABLE-- 添加数据给t_user
insert into t_user values(1,'tom',18),(2,'jerry',18),(3,'rese',18),(4,'jack',18);-- 查询表数据
select * from t_user;-- 方式2: 复制表结构
create external table if not exists t_user2 like t_user;
desc formatted t_user2;
select * from t_user2;-- 方式3: 复制表结构和数据
-- create external table if not exists t_user3 as select * from t_user;-- create - table - as - select不能创建外部表-- 清空表
-- truncate table t_user; -- Cannot truncate non-managed table t_user.-- 删除表
drop table t_user;-- 元数据被删除.但是hdfs上的数据还在.
select * from t_user; -- Table not found 't_user'

 Hive 进阶操作

内部表

-- 创建表
create table stu(id int ,name string,age int);-- 插入数据
insert into stu values (1,'tom',18),(2,'jerry',19);-- 查看数据
select * from stu;-- 复制表结构: CREATE TABLE 表名 like 存在的表名;
create table stu2 like stu;
desc stu2;-- 复制表结构和数据: CREATE TABLE 表名 as select语句;
create table stu3 as select * from stu;
select * from stu3;-- 删除内部表: drop table 内部表名;
drop table stu3; -- 数据也会被删除-- 查看表格式化信息:desc formatted 表名;
desc formatted stu2;-- truncate清空内部表数据: truncate table 内部表名;
truncate table stu;

外部表

create external table teacher(id int ,name string,age int) location '/teacher';-- 插入数据
insert into teacher values (1,'张三',18),(2,'李四',19);-- 复制表结构: CREATE TABLE 表名 like 存在的表名;
create table teacher2 like teacher; -- 复制外部表 不加 external 结果还是内部表
create external table teacher3 like teacher; -- 复制外部表 加 external 结果是外部表.-- 复制表结构: CREATE TABLE 表名  as sql语句;
create table teacher4 as select * from teacher;
select * from teacher4;-- 删除外部表: drop table 外部表名;
drop table teacher;
select * from teacher; -- 表已经被删了.但是表对应的数据还在.-- 查看表格式化信息: desc formatted 表名;
desc formatted teacher2;-- 注意: 外部表不能使用truncate关键字清空数据
truncate table teacher3; --Cannot truncate non-managed table teacher3

查看表

show tables;               : -- 查看所有
show create table 表名;     : -- 查看建表语句
desc 表名;                  :-- 查看表中的列
desc extended 表名;         :-- 查看表的详细信息--一行展示的.不够美观
desc formated 表名;         :-- 查看表的详细信息--格式化展示.

修改表

字段的添加: 
alter table 表名 add columns (字段名 字段类型);
字段的替换: 
alter table 表名 replace columns (字段名 字段类型 , ...);
字段名和字段类型同时修改: 
alter table 表名 change 旧字段名 新字段名 新字段类型;
注意: 字符串类型不能直接改数值类型修改表名: 
alter table 旧表名 rename to 新表名;
修改表路径: 
alter table 表名 set location 'hdfs中存储路径';            
注意: 建议使用默认路径
修改表属性: 
alter table 表名 set tblproperties ('属性名'='属性值');  
alter table stu set tblproperties('EXTERNAL'='TRUE');#必须大写-- 外部表
alter table stu set tblproperties('EXTERNAL'='FALSE');#必须大写 --内部表

分隔符

默认分隔符:
    经过查看发现我们建表不指定分隔符.hive会在我们插入数据的时候默认使用\001作为分隔符.

指定分隔符:
  格式: create table 表名 (列名...) row format delimited fields terminated by '指定分隔符';

指定分隔符建表可以快速映射文件数据.

create table product(id int,name string,price int,category string) row format delimited fields terminated by ',';
-- 加载数据--(把数据文件放置在product表目录下)select * from product; -- 可以查询到product.txt文件中的所有数据.

文件导入

方式1(页面操作): 在hdfsweb页面,直接上传windows文件到指定表的location路径下。

方式2(put上传): 在linux命令行,输入hdfs dfs -put /Linux本地文件路径  /HDFS的指定表的location路径下。

方式3(load加载): 在hive客户端上,输入load data local inpath '/linux本地文件路径' into table 表名;

方式4(load加载): 在hive客户端上,输入load data  inpath '/HDFS的文件路径' into table 表名;

注意: 方式4本质就是把'/HDFS的文件路径'下的文件 移动 到 /HDFS的指定表的location路径下

方式5(insert插入): insert [overwrite | into] table 表名  select 语句;

注意: 方式5如果不加overwrite就是追加写入数据,如果加了overwrite就是覆盖原有数据

 数据导出

方式1(页面操作): 在hdfsweb页面,直接下载指定hdfs文件,到windows文件系统。

方式2(get下载): 在linux命令行,输入hdfs dfs -get  /HDFS的指定表的location路径下  /Linux本地文件路径。

方式3(覆盖导出到linux): insert overwrite local directory '/Linux本地文件路径'  select 语句;

方式4(覆盖导出到hdfs): insert overwrite directory '/HDFS文件路径'  select 语句;

方式5(执行sql语句重定向到文件): hive -e sql语句 > 文件  #跳过登录直接运行sql命令
 
方式6(执行sql脚本重定向到文件): hive -f sql脚本 > 文件   #跳过登录直接运行sql脚本

导出至Windows

 导出至Linux

使用insert 导出至Linux  

# 把表导出到linux目录中.分隔符默认
insert overwrite local directory '/opt/export1' select * from products; # 把表导出到linux目录中.分隔符指定为逗号.
insert overwrite local directory '/opt/export2' row format delimited fields terminated by ',' select * from products;

 覆盖导出到hdfs

# 不加local就是导出到hdfs上
insert overwrite directory '/export1' select * from products; 

 执行sql语句重定向到文件

hive命令在linux执行:
# hive -e 'sql' : 免登录执行sql语句.
# 把查询结果重定向到文件中
[root@node1 export2]# hive -e 'select * from db1.products' > /opt/export3.txt  

 执行sql脚本重定向到文件

# hive -f sql脚本文件 : 免登录执行sql脚本
[root@node1 opt]# hive -f myhive.sql > products4.txt


http://www.ppmy.cn/ops/131943.html

相关文章

第73期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

闪耀CeMAT亚洲物流展,驭势科技发布第五代U-Drive®智驾系统

11月5日,驭势科技于CeMAT首日,举行主题为 “驱动物流创新引擎,重塑产业新质生态”的新品发布会,正式发布第五代U-Drive智能驾驶系统。来自各行业的生态伙伴及业内专家莅临现场,共同见证驭势科技在自动驾驶技术领域的又…

元戎启行嵌入式面试题及参考答案

介绍下 CAN 通信原理 控制器局域网(CAN)是一种串行通信协议,主要用于汽车、工业自动化等领域的电子控制单元(ECU)之间的通信。 其通信原理是基于多主站架构。在总线上,多个节点(设备)都可以主动发起通信。CAN 协议使用差分信号来传输数据,通过两条信号线 CAN_H 和 CAN…

99、Python并发编程:多线程的问题、临界资源以及同步机制

引言 多线程技术的引入,可以帮助我们实现并发编程,一方面可以充分利用CPU计算资源,另一方面,可以在用户体验上带来极大的改善。但是,多线程技术也存在一些问题。本文就来简单聊一下多线程引入导致的问题,以…

[react]10、react性能优化

1、列表&key 一、React更新流程 React在props或state发生改变时,会调用React的render方法,会创建一颗不同的树。React需要基于这两颗不同的树之间的差别来判断如何有效的更新UI。 同层节点之间相互比较,不会垮节点比较;不同类型的节点&am…

【Linux】进程控制——创建,终止,等待回收

目录 进程创建fork再介绍写时拷贝 进程终止退出码退出方式 进程等待获取子进程statuswaitwaitpid 在前两篇进程概念中,对进程进行了介绍,进行了初步认识,也认识到了与之相关联的进程地址空间;本文则对进程的生命周期——创建&…

正则表达式在Kotlin中的应用:提取图片链接

在现代的Web开发中,经常需要从网页内容中提取特定的数据,例如图片链接。Kotlin作为一种现代的编程语言,提供了强大的网络请求和文本处理能力。本文将介绍如何使用Kotlin结合正则表达式来提取网页中的图片链接。 正则表达式基础 正则表达式是…

Wecom酱搭建企业微信发送消息

Wecom酱 https://github.com/easychen/wecomchan 企业微信 https://work.weixin.qq.com/ 获取企业id 创建应用 获取企业微信应用id、secret 设置可信域名和可信ip 邀请用户关注 https://你的域名/wxsend.php?sendkeydyf&msg测试 发送成功