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

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;


 

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

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

相关文章

uniapp页面vue3下拉触底发送获取新数据请求实现分页功能

页面下拉触底获取新数据实现分页功能实现方式有两种,根据自己的业务需求来定,不同的方案适用场景不一样,有的是一整个页面下拉获取新数据,有的是部分盒子内容滚动到底部时候实现获取新数据,下面讨论一下两种方式的区别…

是他将计算机从“一屋子”变成“一柜子”——量子前哨缅怀小型机之父 戈登·贝尔

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨沛贤 深度好文:6000字丨15分钟阅读 5 月 21 日, 美国贝尔实验室资深人士 John Mashey 发布消息称,计算机先驱戈登贝尔(Gordon…

精通C++ STL(二):string类的模拟实现

目录 string类各函数接口总览 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve和resize empty 修改字符串相关函数 push_back append operator insert erase clear swap c_str 访…

[数据集][目标检测]森林火灾检测数据集VOC+YOLO格式362张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):362 标注数量(xml文件个数):362 标注数量(txt文件个数):362 标注类别…

《开发问题解决》Window下7z解压:cannot create symbolic link : 客户端没有所需的特权

问题描述: 今天使用7z来解压东西的是突然出现这个问题。 问题解决: download直接下载到c盘中,由于所在文件夹有权限限制。无法进行正常解压。 7.zip解压时使用管理员权限进行解压,解压时使用管理员权限。即如图 使用管理员权限重…

代码随想录算法训练营第四十一天|动态规划理论基础、509. 斐波那契数列、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就…

android-mvp模式

mvvm可以理解成使用databing的mvp模式,modleview 通过接口让view和Presenter层解耦 从图中就可以看出,最明显的差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view…

技术面‍:前端代码是如何与服务器交互的

前言: 本篇文章主要是想讲解 .html 文件和 .CSS 文件在实际开发中和后端服务器交互最后上线的基础原理。 面向的人群🆕:是刚入行不久,且目前只会写前端业务代码而不清楚整个工作流的前端新人。我会从 0 开始一步一步带你理解整个…

Kubernetes(k8s) v1.30.1 本地集群部署 安装metallb 支持LoadBalancer 生产环境 推荐 BGP模式部署

1 metallb 安装参考:Kubernetes(k8s) v1.30.1 本地集群部署 默认不支持LoadBalancer metallb来解决-CSDN博客 2 删除 Layer 2 模式 配置 kubectl delete -f IPAddressPool.yaml kubectl delete -f L2Advertisement.yaml kubectl delete -f discuz-srv.yaml 3 配置 k8s Metal…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀,从发布赛题一直到现在,总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

【Python】 XGBoost模型的使用案例及原理解析

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…

SQL使用函数给多个分表添加同一字段

数据库中分表时,往往需要向多个分表中添加同一个字段,可以定义一个函数,每次调用这个函数向多个份表中添加同意字段。 1、创建函数示例: 在PostgreSQL中创建一个简单的函数 以下是一个在PostgreSQL中创建函数的简单示例&#x…

Mac安装 Intellij IDEA,亲测有效M1、M2可用

引言 最近开始学习使用spring boot写一个简单的后端项目,使用Intellij IDEA软件,Intellij IDEA为新用户提供了30天的免费试用。 方案 1.官网下载Intellij IDEA IntelliJ IDEA – the Leading Java and Kotlin IDE 或者直接网盘连接下载:…

OrangePi AIpro开箱评测

开箱评测 有幸受邀参与了CSDN与OrangePi组织的评测活动,今天刚收到快递。拆开快递能看到保护盒、电源、双头typec线这三样(充电器和线有保护膜的我先拆掉了) 打开保护盒,能看到上下两块黑色海棉包裹的开发板(保护得不…

三、Servlet基础

注:因为我并不完全是为了从0开始Java开发,因此,我这里先暂时跳过第二章服务器环境相关的内容,直接开始第三章的内容。 3.1、Servlet 的基本结构: ​ 下面的代码给出了一个基本的 Servlet ,它处理 GET 请求…

QtXlsx库编译使用

文章目录 一、前言二、Windows编译使用2.1 用法①:QtXlsx作为Qt的附加模块2.1.1 检验是否安装Perl2.1.2 下载并解压QtXlsx源码2.1.3 MinGW 64-bit安装模块2.1.4 测试 2.2 用法②:直接使用源码 三、Linus编译使用3.1、安装Qt5开发软件包:qtbas…

翻译《The Old New Thing》- Why are INI files deprecated in favor of the registry?

Why are INI files deprecated in favor of the registry? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071126-00/?p24383 Raymond Chen 2007年11月26日 为什么弃用 INI 文件而改用注册表? 欢迎,Slashdot的读…

【再探】设计模式—职责链模式、命令模式及迭代器模式

行为型设计模式研究系统在运行时对象之间的交互,进一步明确对象的职责。有职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式及访问模式共11种。 1 职责链模式 需求:1) 请求能被多…

2024可信赖的企业级生成式 AI 白皮书

来源:COPU&IBM: 近期历史回顾:

[随笔] 在CSDN的6周年纪念日随笔

纪念 转眼已过6年,大一的时候学习编程,潜水 CSDN 学习各类博文,才学浅薄就没有主动写博文记录自己的学习历程。 过了段时间刚刚到了大二,很喜欢 Todolist,意气风发的写下《一份清爽的编程计划》,哈哈。 …