摸鱼大数据——Hive表操作——基本操作

news2024/9/24 7:26:09

Hive表操作

Hive乱码解决

1、乱码现象

create database test1 comment "乱码测试";

use test1;

CREATE TABLE orders (
    orderId bigint COMMENT '订单id',
    orderNo string COMMENT '订单编号',
    shopId bigint COMMENT '门店id'
);

2、处理步骤
  • 注意:推荐先将node1虚拟机拍一个快照,拍完后再修改。

  • 在node1上修改hive配置文件

    文件路径: /export/server/hive/conf/hive-site.xml

    修改内容:&useUnicode=true&characterEncoding=UTF-8

    修改截图:

修改MySQL表:注意,下面的SQL语句,要在node1的MySQL上运行

use hive3;
#修改表字段注解和表注解
alter table DBS modify column `DESC` varchar(256) character set utf8;
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
#修改分区字段注解
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
#修改索引注解
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

  • 重启Hive的metastore进程

    先通过kill -9 杀死metastore进程。然后再通过 nohup hive --service metastore & 重启

  • 验证

drop database test1 cascade;

create database test1 comment "乱码测试";

use test1;

CREATE TABLE orders (
    orderId bigint COMMENT '订单id',
    orderNo string COMMENT '订单编号',
    shopId bigint COMMENT '门店id'
);

建表语法

create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... )
[partitioned by (分区字段名 分区字段类型)] # 分区表固定格式
[clustered by (分桶字段名)  into 桶个数 buckets]  # 分桶表固定格式 注意: 可以排序[sorted by (排序字段名 asc|desc)]
[row format delimited fields terminated by '字段分隔符'] # 自定义字段分隔符固定格式
[stored as textfile]  # 默认即可
[location 'hdfs://node1.itcast.cn:8020/user/hive/warehouse/库名.db/表名'] # 默认即可
; # 注意: 最后一定加分号结尾

注意: 
    1- 关键字顺序是从上到下从左到右,否则报错
    2- 关键字不区分大小写。也就是例如create可以大写也可以小写

数据类型

1、基本数据类型
    整数: int  
    小数: float double  
    字符串: string varchar(长度)  
    日期: date timestamp
    
    补充: timestamp时间戳,指的是从1970-01-01 00:00:00 到现在的时间的差值。
​
​
2、复杂数据类型
    集合: array  
    映射: map   
    结构体: struct  
    联合体: union 

表分类

Hive中可以创建的表有好几种类型, 分别是:
内部表(管理表): MANAGED_TABLE
    分区表
    分桶表
​
外部表(非管理表): EXTERNAL_TABLE
    分区表
    分桶表
​
default默认库存储路径: hdfs://node1:8020/user/hive/warehouse
自定义库在HDFS的默认存储路径: hdfs://node1:8020/user/hive/warehouse/数据库名称.db
自定义表在HDFS的默认存储路径: hdfs://node1:8020/user/hive/warehouse/数据库名称.db/表名称
业务数据文件在HDFS的默认存储路径: hdfs://node1:8020/user/hive/warehouse/数据库名称.db/表名称/业务数据文件
​
内部表和外部表区别?
内部表: 创建的时候没有external关键字,默认创建的就是内部表,也称之为普通表/管理表/托管表
删除内部表: 同时会删除MySQL中的元数据信息,还会删除HDFS上的业务数据
    
外部表: 创建的时候有external关键字,创建的就是外部表,也称之为非托管表/非管理表/关联表
删除外部表: 只会删除MySQL中的元数据信息,不会删除HDFS上的业务数据
​
-- 创建内部表
-- 注意事项:
use hive1;

create table stu1(
  id int,
  name string
);

create table stu2(
  id int,
  name string
);

-- 创建外部表
create external table stu3(
  id int,
  name string
);

-- 查看表结构
desc stu1;
desc stu3;

-- 查看表格式化的信息
desc formatted stu1;
desc formatted stu3;

-- 添加数据到表里面
insert into stu1 values(1,'zhangsan');
insert into stu3 values(1,'zhangsan');

-- 删除表
drop table stu1; -- 内部表
drop table stu3; -- 外部表

删除内部表和外部表前后元数据信息的变化

内部表信息:

外部表信息:

Hive建表的时候可能遇到的错误:

原因: 在Hive中int数据类型,不能指定长度

默认分隔符

创建表的时候,如果不指定分隔符,以后表只能识别默认的分隔符,键盘不好打印,展示形式一般为:\0001,SOH,^A,□
Hive表的默认分隔符\001

示例:

-- 默认分隔符: 创建表的时候不指定就代表使用默认分隔符
-- 1.创建表
create table stu(
    id int,
    name string
);
-- insert方式插入数据,会自动使用默认分隔符把数据连接起来
-- 2.插入数据
insert into stu values(1,'zhangsan');
-- 3.验证数据
select * from stu;
-- 当然也可以通过在hdfs中查看,默认分隔符是\0001,其他工具中也会展示为SOH,^A,□

内部表

创建普通内部表: 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 表名;

示例:

-- 内部表的操作
​
-- 创建和使用数据库
create database myhive;
use myhive;
​
-- 创建内部表
create table if not exists stu(
    id int,
    name string
);
​
-- 插入数据
insert into stu values(1,'张三');
​
​
-- 查询表数据
-- 下面语句被Hive进行了优化,不会变成MapReduce
select * from stu;
-- 这个会变成MapReduce
select name,count(1) from stu group by name;
​
​
-- 建表的时候指定字段间的分隔符
create table if not exists stu1(
    id int,
    name string
) row format delimited fields terminated by ',';
​
insert into stu1 values(1,'张三');
​
-- 创建表的其他方式
-- 创建stu2表的时候,复制stu1的表结构,并且将select的查询结果插入到stu2的表的里面去
-- 注意不会复制原表的分隔符,新表用的还是默认
create table stu2 as select * from stu1;
​
select * from stu2;
​
-- 该方式只会复制stu1表的结构,没有数据。
create table stu3 like stu1;
​
select * from stu3;
​
-- 查询表信息
-- 查看当前数据库中的所有表
show tables;
​
-- 查询表的基本信息
desc stu3;
​
-- 查看表的扩展信息
desc extended stu3;
​
desc formatted stu3;
​
​
-- 查看指定表的建表语句
show create table stu3;
​
-- 删除表
drop table stu;
​
-- 清空表数据。需要保留表结构,但是不想要数据
select * from stu1;
truncate table stu1;
select * from stu1;

外部表

创建外部表: create external table [if not exists] 外部表名(字段名 字段类型 , 字段名 字段类型 , ... )[row format delimited fields terminated by '字段分隔符'] ;
​
复制表: 方式1: like方式复制表结构    注意: as方式不可以使用
​
删除外部表: drop table 外部表名;
    注意: 删除外部表效果是mysql中元数据被删除,但是存储在hdfs中的业务数据本身被保留
    
查看表格式化信息: desc formatted 表名; -- 外部表类型: EXTERNAL_TABLE
​
注意: 外部表不能使用truncate清空数据本身
​
总结: 外部表对HDFS上的业务数据的管理权限并不高,drop表不会删除业务数据,同时不能使用truncate和delete来删除表数据。我们可以通过HDFS的shell来删除业务数据

示例:

-- 创建数据库
create database if not exists day06;
​
-- 使用数据库
use day06;
​
-- 创建外部表
create external table outer_stu1(
    id int,
    name string
);
​
-- 添加数据
insert into outer_stu1 values (1,'zhangshan');
​
-- Hive底层对部分SQL语句进行了优化,不会变成MapReduce
select * from outer_stu1;
​
-- 创建外部表的方式2
-- 注意: 不管是什么方式创建外部表,一定要加上external关键字
create external table outer_stu2 like outer_stu1;
desc formatted outer_stu2;
​
-- 大小写转换快捷键: ctrl+shift+U
create EXTERNAL table outer_stu3 like outer_stu1;
desc formatted outer_stu3;
​
-- 这种方式创建的还是内部表
create table stu2 like outer_stu1;
-- 查看表的详细信息
desc formatted stu2;
​
​
-- 创建外部表的方式3
-- 注意: 针对外部表,不能使用create external table 外部表名 as select 来创建
create external table outer_stu4 as select * from outer_stu1;
​
​
-- 删除表
-- 该表的数据存放路径 hdfs://node1:8020/user/hive/warehouse/day06.db/outer_stu1
-- HDFS的路径中为什么是node1,因为namenode运行在node1上面
drop table outer_stu1;
​
-- 清空表
insert into outer_stu3 values (1,'zhangshan');
select * from outer_stu3;
-- truncate table outer_stu3;
delete from outer_stu3;
update outer_stu3 set name='wangwu';
select * from outer_stu3;
​
​
-- 创建数据库
create database if not exists day06;
​
-- 使用数据库
use day06;
​
-- 创建外部表
create external table outer_stu1(
    id int,
    name string
);
​
-- 添加数据
insert into outer_stu1 values (1,'zhangshan');
​
-- Hive底层对部分SQL语句进行了优化,不会变成MapReduce
select * from outer_stu1;
​
-- 创建外部表的方式2
-- 注意: 不管是什么方式创建外部表,一定要加上external关键字
create external table outer_stu2 like outer_stu1;
desc formatted outer_stu2;
​
-- 大小写转换快捷键: ctrl+shift+U
create EXTERNAL table outer_stu3 like outer_stu1;
desc formatted outer_stu3;
​
-- 这种方式创建的还是内部表
create table stu2 like outer_stu1;
-- 查看表的详细信息
desc formatted stu2;
​
​
-- 创建外部表的方式3
-- 注意: 针对外部表,不能使用create external table 外部表名 as select 来创建
create external table outer_stu4 as select * from outer_stu1;
​
​
-- 删除表
-- 该表的数据存放路径 hdfs://node1:8020/user/hive/warehouse/day06.db/outer_stu1
-- HDFS的路径中为什么是node1,因为namenode运行在node1上面
drop table outer_stu1;
​
-- 清空表
insert into outer_stu3 values (1,'zhangshan');
select * from outer_stu3;
-- truncate table outer_stu3;
delete from outer_stu3;
update outer_stu3 set name='wangwu';
select * from outer_stu3;

快速创建外部表不支持的操作:

注意: 针对外部表,不能使用create external table 外部表名 as select 来创建

清空外部表的时候遇到的错误:

原因: 不能使用truncate语句来清空外部表
解决办法: 可以使用delete from 外部表名称。但是有前提条件,需要开启表对事务的支持

如果执行delete会报如下错误:

原因: 对表数据使用delete进行删除的时候,需要先开启事务
注意: 默认不会去开启Hive对事务的支持,事务开启后比较消耗性能。https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

查看和修改表

查看所有表: show tables;
查看建表语句: show create table 表名;
查看表信息: desc 表名;
查看表结构信息: desc 表名; 
查看表格式化信息: desc formatted 表名;            注意: formatted能够展示详细信息
​
修改表名: alter table 旧表名 rename to 新表名
字段的添加: alter table 表名 add columns (字段名 字段类型);
字段的替换: alter table 表名 replace columns (字段名 字段类型 , ...);
替换的时候注意: 替换的时候,是使用新的字段信息替换原有的所有字段。也就是如果某些字段不想变化,你也需要把它写到替换的信息后面。
​
字段名和字段类型同时修改: alter table 表名 change 旧字段名 新字段名 新字段类型;
    注意: 字符串类型不能直接改数值类型,这句话是有方向的。也就是字符串不能随便变成数值,但是数值可以变成字符串。举例:"hello world"变成数值的时候,Hive内部是不知道它对应的数值是多少;123 可以变成 "123"字符串
    
修改表路径: alter table 表名 set location 'hdfs中存储路径';             
注意: 建议使用默认路径
location:  建表的时候不写有默认路径/user/hive/warehouse/库名.db/表名,当然建表的时候也可以直接指定路径
​
修改表属性: alter table 表名 set tblproperties ('属性名'='属性值');     注意: 经常用于内外部表切换
内外部表类型切换:  外部表属性: 'EXTERNAL'='true'   内部表属性: 'EXTERNAL'='false'
注意: 属性中的EXTERNAL名称不能随意改动,必须与Hive官网保持一致。
​
表支持的属性: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-listTableProperties

示例:

use day06;
​
-- 创建内部表和外部表
create table inner_stu (
    id int,
    name string
);
​
​
create external table outer_stu (
    id int,
    name string
);
​
-- 添加数据
insert into inner_stu values(1,'zhangshan');
insert into outer_stu values(1,'zhangshan');
​
-- 查看当前数据库下面的所有表
show tables;
​
-- 查看建表语句
show create table inner_stu;
show create table outer_stu;
​
-- 不管是查看内部表还是外部表的建表语句,都是show create table 表名称的语法
-- show create external table outer_stu;
​
-- 查看表的详细信息
desc inner_stu;
desc formatted inner_stu;
​
-- 表字段的操作
-- 表添加字段(列名是同一个意思)
alter table inner_stu add columns(age int);
​
desc inner_stu;
​
-- 替换表中的字段
-- 替换指的是将表中原有的所有字段都替换
alter table outer_stu replace columns(age int);
alter table outer_stu replace columns(id int,age int);
alter table outer_stu replace columns(id int,age int,name string);
-- 注意:字符串类型的字段不能随便直接改成数值类型。
alter table outer_stu replace columns(id int,name string,age int);
alter table outer_stu replace columns(id int,name string,age string);
desc outer_stu;
​
select * from outer_stu;
​
-- 同时修改字段名称和数据类型
alter table outer_stu change age new_age varchar(10);
-- 注意:字符串类型的字段不能随便直接改成数值类型。
-- 其中的解决办法:重新建一张表,然后把旧表的数据全部插入到新表里面去
alter table outer_stu change new_age age int;
desc outer_stu;
​
​
-- 表的修改操作
-- 修改表名称
alter table inner_stu rename to my_inner_stu;
​
-- 修改表数据存放路径
-- 注意: 不推荐修改,就使用默认路径
desc formatted my_inner_stu;
alter table my_inner_stu set location '/dir/inner_stu';
desc formatted my_inner_stu;
​
-- 添加数据
insert into my_inner_stu values(1,'zhangshan',18);
​
select * from my_inner_stu;
desc formatted my_inner_stu;
​
-- 修改表属性
-- 内外部表相互转换
-- 内部表 -> 外部表
alter table my_inner_stu set tblproperties ('EXTERNAL'='true');
​
desc formatted my_inner_stu;
​
​
-- 外部表 -> 内部表
desc formatted outer_stu;
alter table outer_stu set tblproperties ('EXTERNAL'='false');
desc formatted outer_stu;

修改表路径前后对比:

show create table中可能遇到的问题:

原因: 不管是查看内部表还是外部表的建表语句,都是show create table 表名称的语法

原因: 字符串类型的字段不能随便变成数值类型

快速映射表

创建表的时候指定分隔符: create [external] table 表名(字段名 字段类型)row format delimited fields terminated by 符号;
​
加载数据: load data [local] inpath '文件路径' into table Hive表名称

示例:

HDFS示例:

use day06;
​
-- 1- 创建表
create table jd_products(
    id int,
    name string,
    price float,
    c_id string
)row format delimited fields terminated by ',';
​
​
-- 2- 数据上传到HDFS中
-- hdfs dfs -put products.txt /day06
​
-- 3- 加载前先检查表数据
select * from jd_products;
​
-- 4- 将HDFS中的数据加载到Hive表中
load data inpath '/day06/products.txt' into table jd_products;
​
-- 5- 数据验证
select * from jd_products;

本地映射示例:

use day06;
​
-- 1- 创建表
create table jd_products_local(
    id int,
    name string,
    price float,
    c_id string
)row format delimited fields terminated by ',';
​
​
-- 2- 加载前先检查表数据
select * from jd_products_local;
​
-- 4- 将本地中的数据加载到Hive表中
-- 推举使用从HDFS上面将数据加载到Hive
load data local inpath '/home/products.txt' into table jd_products_local;
​
-- 5- 数据验证
select * from jd_products_local;


 

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

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

相关文章

关于研发过程中的代码版本控制的思考

文章目录 前言一、研发(1)分支管理(2)代码提交规范(3)版本号控制 二、测试(1)研发自测与用例评审研发自测测试人员测试 (2)BUG反馈与复测(3&#…

HQL面试题练习 —— 合并数据

题目来源:京东 目录 1 题目2 建表语句3 题解 1 题目 已知有数据 A 如下,请分别根据 A 生成 B 和 C。 数据A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…

【软件设计师】程序语言

1.程序设计语言基本概念 1.1 低级语言与高级语言 低级语言:机器语言和汇编语言称为低级语言 机器语言指0.,1组成的机器指令序列 汇编语言指用符号表示指令的语言,如MOV AX,2 高级语言:从人类的逻辑角度出发&#xff0…

WebGL在医学成像方面的应用

WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…

蓝牙----wireshark抓包查看蓝牙通信过程

一.完整过程 二.过程详细分析 1.广播数据----可连接的无定向广播包:ADV_IND 2.广播数据----主动扫描:扫描请求(SCAN_REQ) 扫描相应(SCAN_RSP)3.被动扫描数据发送连接请求 4.蓝牙配对(没有用到…

香橙派 AIpro开发板:开启AI视觉的无限可能

前言 在当今这个由数据和智能驱动的时代, 人工智能(AI) 已经成为推动技术创新和实现自动化的关键。 特别是在计算机视觉领域,AI的潜能被无限放大,它使得机器能够“看见”并理解视觉世界,从而执行复杂的任务…

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中,良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件,帮助企业做出明智的选择。 一、企业内…

Java面试八股之synchronized关键字的作用

synchronized关键字的作用 同步与线程安全:synchronized是Java中的一个关键字,用于提供一种同步机制,确保线程安全。它通过在多线程环境中控制对共享资源的访问,防止数据的不一致性问题。 修饰代码块:当synchronized…

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…

武汉网红餐馆火灾背后的安全警示:可燃气体报警器需定期校准

在餐饮业快速发展的今天,安全问题一直是行业内外关注的重点。 最近,武汉一家网红餐馆在就餐高峰期突发火灾,事件迅速成为公众关注的焦点。这一事故不仅给餐馆带来了重大损失,也引发了对于餐馆安全管理的深思。 尤其是可燃气体报…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

OrangePi AIPro:次世代嵌入式边缘AI计算与智能机器人应用开发平台

近年来,随着物联网(IoT)和人工智能(AI)技术的快速发展,嵌入式边缘计算板卡在智能设备中的应用越来越广泛。OrangePi AIpro作为一款轻量化高性能的嵌入式边缘人工智能计算SoC,在硬件配置、AI性能和使用便利性方面都有着突出的表现。本文将详细评测OrangePi AIpro的各个方…

【Flutter】Dialog组件PageView组件

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月27日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

重生之while在鸣潮学习HTML

个人主页:终端 今天是开荒的第五天,数据坞都刷了吗,没刷就过来学html! 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

图形学初识--双线性插值算法

文章目录 为什么需要双线性插值算法?双线性插值算法是什么?如何双线性插值?结尾:喜欢的小伙伴可以点点关注赞哦 为什么需要双线性插值算法? ChatGP回答: 双线性插值(bilinear interpolation&am…

【UE5.1 角色练习】08-传送技能

前言 在上一篇(【UE5.1 角色练习】07-AOE技能)基础上继续实现人物通过鼠标点击然后传送技能的功能。 效果 步骤 1. 首先需要显示鼠标光标,我们可以在玩家控制器中勾选“显示鼠标光标” 2. 在项目设置中添加一个操作映射,设置按…

助力企业标准化搭建--图框模板的创建

古有秦皇书同文、车同轨,今各行各业都有国际标准、国家标准,其目的就是为了标准化、统一化,由此可见标准化的重要性;一个企业若是想规范员工的操作,推行标准化也很重要;因此对于需要绘制电气图纸的行业来说…

路由器交换机直连方案(RM50+RTL8367N)

不经过网口和变压器,实现板级网口扩展。 通过网口,网线连接 板级芯片直接连接,验证OK 激光导航控制板通过路由器上网成功