【Python大数据笔记_day06_Hive】

hive内外表操作

建表语法

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://域名:8020/user/hive/warehouse/库名.db/表名'] # 默认即可
; # 注意: 最后一定加分号结尾

注意: 关键字顺序是从上到下从左到右,否则报错

default默认库存储路径:  /user/hive/warehouse   
自定义库在HDFS的默认存储路径:    /user/hive/warehouse/库名.db
自定义表在HDFS的默认存储路径:    /user/hive/warehouse/库名.db/表名
业务数据文件在HDFS的默认存储路径:    /user/hive/warehouse/库名.db/表名/数据文件

 数据类型

基本数据类型:  整数: int  小数: float double  字符串: string varchar(长度)  日期: date timestamp

复杂数据类型:  集合: array  映射: map   结构体: struct  联合体: union 

 表分类

Hive中可以创建的表有好几种类型, 分别是:
内部表:又叫管理表或者托管表
    分区表(分区分桶表)
    分桶表
外部表:又叫非管理表或者非托管表
    分区表(分区分桶表)
    分桶表
    

内部表和外部表区别?
内部表: 未被external关键字修饰的即是内部表, 即普通表。 内部表又称管理表,还可以叫托管表
    删除内部表:直接删除元数据(metadata)和存储数据本身
外部表: 被external关键字修饰的即是外部表, 即关联表。 还可以叫非管理表或非托管表
    删除外部表:仅仅是删除元数据(metadata),不会删除存储数据本身
    
查看表格式化信息: desc formatted 表名; 
    -- 内部表类型: MANAGED_TABLE
    -- 外部表类型: EXTERNAL_TABLE

-- 内部表(又叫管理表或者托管表)
create table stu1(
    id int,
    name string
);
-- 外部表(又叫非管理表,非托管表)
create external table stu2(
    id int,
    name string
);
-- 查看表结构
desc stu1;
desc stu2;
-- 查看表格式化信息
desc formatted stu1; -- 内部表类型: managed_table
desc formatted stu2; -- 外部表类型: external_table

-- 演示内外部表的重点区别
-- 删除内部表(管理表/托管表),会删除表相关的所有数据
insert into stu1 values(1,'张三');
drop table stu1;
-- 删除外部表,只删除了元数据,hdfs中业务数据保留
insert into stu2 values(1,'张三');
drop table stu2;
-- 再次建表后,可以使用location重新关联原来hdfs保留的业务数据
create external table stu22(
    id int,
    name string
)location '/user/hive/warehouse/hive1.db/stu2';
-- 验证数据
select * from stu22 limit 10;

 内部表基本操作

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

复制内部表: 方式1: like方式复制表结构    方式2: as 方式复制表结构和数据

删除内部表: drop table 内部表名;
    注意: 删除内部表效果是mysql中表相关元数据被删除,同时存储在hdfs中的业务数据本身也被删除

查看表格式化信息: desc formatted 表名; -- 内部表类型: MANAGED_TABLE

注意: 还可以使用truncate清空内部表数据    格式: truncate table 内部表名;

-- 操作表的前提:先有库并使用它
create database hive2;
use hive2;
-- 一.内部表的创建和删除
-- 1.演示创建内部表
-- 建表方式1
create table inner_stu1(
    id int,
    name string
);
-- 插入数据
insert into inner_stu1 values(1,'张三');

-- 建表方式2: 复制表结构
create table inner_stu2 like inner_stu1;
-- 插入数据
insert into inner_stu2 values(1,'张三');

-- 建表方式3: 复制表结构和数据
create table inner_stu3 as
select * from inner_stu1;


-- 2.演示查看内部表结构详细信息
-- 内部表类型: MANAGED_TABLE
desc formatted inner_stu1;
desc formatted inner_stu2;
desc formatted inner_stu3;


-- 3.演示内部表的删除
-- 删除内部表
drop table inner_stu3;-- 元数据和业务数据均被删除
-- 清空内部数据
truncate table inner_stu2;
-- 注意: delete和update不能使用
delete from inner_stu1;-- 报错
update inner_stu1 set name = '李四'; -- 报错

外部表基本操作

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

复制表: 方式1: like方式复制表结构    注意: as方式不可以使用

删除外部表: drop table 外部表名;
    注意: 删除外部表效果是mysql中元数据被删除,但是存储在hdfs中的业务数据本身被保留
    
查看表格式化信息: desc formatted 表名; -- 外部表类型: EXTERNAL_TABLE

注意: 外部表不能使用truncate清空数据本身

-- 二.外部表的创建和删除
-- 1.外部的表创建
-- 建表方式1
create external table outer_stu1(
    id int,
    name string
);
-- 插入数据
insert into outer_stu1 values(1,'张三');

-- 建表方式2
create external table outer_stu2 like outer_stu1;
-- 插入数据
insert into outer_stu2 values(1,'张三');

-- 注意: 外部表不能使用create ... as 方式复制表
create external table outer_stu3 as
    select * from outer_stu1; -- 报错

-- 2.演示查看外部表结构详细信息
-- 外部表类型: EXTERNAL_TABLE
desc formatted outer_stu1;
desc formatted outer_stu2;


-- 3.演示外部表的删除
-- 删除表
drop table outer_stu2;
-- 注意: 外部表不能使用truncate关键字清空数据
truncate table outer_stu1; -- 报错
-- 注意: delete和update不能使用
delete from outer_stu1; -- 报错
update outer_stu1 set name = '李四'; -- 报错

查看/修改表

 查看所有表: 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 旧字段名 新字段名 新字段类型;
    注意: 字符串类型不能直接改数值类型
    
修改表路径: alter table 表名 set location 'hdfs中存储路径';             注意: 建议使用默认路径
location:  建表的时候不写有默认路径/user/hive/warehouse/库名.db/表名,当然建表的时候也可以直接指定路径

修改表属性: alter table 表名 set tblproperties ('属性名'='属性值');     注意: 经常用于内外部表切换
内外部表类型切换:  外部表属性: 'EXTERNAL'='TRUE'   内部表属性: 'EXTERNAL'='FALSE'

-- 三.表的查看/修改操作
-- 验证之前的内外部表是否存在以及是否有数据,如果没有自己创建,如果有直接使用
select * from inner_stu1 limit 1;
select * from outer_stu1 limit 1;
-- 1.表的查看操作
-- 查看所有的表
show tables;
-- 查看建表语句
show create table inner_stu1;
show create table outer_stu1;
-- 查看表基本机构
desc inner_stu1;
desc outer_stu1;
-- 查看表格式化详细信息
desc formatted inner_stu1;
desc formatted outer_stu1;

-- 2.表的修改操作
-- 修改表名
-- 注意: 外部表只会修改元数据表名,hdfs中表目录名不会改变
alter table inner_stu1 rename to inner_stu;
alter table outer_stu1 rename to outer_stu;
-- 修改表中字段
-- 添加字段
alter table inner_stu add columns(age int);
alter table outer_stu add columns(age int);
-- 替换字段
alter table inner_stu replace columns(id int,name string);
alter table outer_stu replace columns(id int,name string);
-- 修改字段
alter table inner_stu change name sname varchar(100);
alter table outer_stu change name sname varchar(100);

-- 修改表路径(实际不建议修改)
-- 注意: 修改完路径后,如果该路径不存在,不会立刻创建,以后插入数据的时候自动生成目录
alter table inner_stu set location '/inner_stu';
alter table outer_stu set location '/outer_stu';

-- 修改表属性
-- 先查看类型
desc formatted inner_stu; -- MANAGED_TABLE
desc formatted outer_stu; -- EXTERNAL_TABLE
-- 内部表改为外部表
alter table inner_stu set tblproperties ('EXTERNAL'='TRUE');
-- 外部表改为内部表
alter table outer_stu set tblproperties ('EXTERNAL'='FALSE');
-- 最后再查看类型
desc formatted inner_stu; -- EXTERNAL_TABLE
desc formatted outer_stu; -- MANAGED_TABLE

 默认分隔符

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

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

快速映射表

 创建表的时候指定分隔符: create [external] table 表名(字段名 字段类型)row format delimited fields terminated by 符号;

加载数据: load data [local] inpath '结构化数据文件' into table 表名;

-- 创建表
create table products(
    id int,
    name string,
    price double,
    cid string
)row format delimited
fields terminated by ',';
-- 加载数据
-- 注意: 如果从hdfs中加载文件,本质就是移动文件到对应表路径下
load data inpath '/source/products.txt' into table products;
-- 验证数据
select * from products limit 1;

数据导入和导出

文件数据加载导入

1.直接上传文件

Windows页面上传

需求: 已知emp1.txt文件在windows/mac系统,要求使用hdfs保存此文件 并且使用hivesql建表关联数据

-- 1.先在hive上根据数据建表,然后在window/mac上传文件到hdfs表路径中
create table emp1(
    id int,
    name string,
    sal double,
    dept string
)row format delimited
fields terminated by ',';

-- windows使用hdfs页面上传文件
-- node1:9870访问页面把emp1.txt上传到/user/hive/warehouse/hive02.db/emp1路径下
-- 查询数据
select * from emp1;
 Linux本地put上传

需求: 已知emp2.txt文件在linux系统,要求使用hdfs保存此文件 并且使用hivesql建表关联数据

-- 2.先在hive上根据数据建表,然后在linux上传文件到hdfs表路径中
create table emp2(
    id int,
    name string,
    sal double,
    dept string
)row format delimited
fields terminated by ',';

-- linux使用hdfs命令上传文件
-- [root@node1 ~]# hdfs dfs -put emp2.txt /user/hive/warehouse/hive02.db/emp2

-- 查看数据
select * from emp2;

2.load加载文件

 从hdfs路径把文件移动到表对应存储路径中: load data inpath 'HDFS文件路径' [overwrite] into table 表名;

从linux本地把文件上传到表对应存储路径中: load data local inpath 'Linux文件路径' [overwrite] into table 表名;

 load移动HDFS文件
-- 数据导入
-- 需求1: load加载hdfs中文件到表路径中
-- 1.根据资料中search_log.txt数据创建表
create table search_log(
    dt string,
    uid string,
    name string,
    url string
)row format delimited fields terminated by '\t';
-- 2.把windows中search_log.txt文件上传hdfs其他路径,例如:/src中
-- 3.使用load把hdfs的/src中的文件移动到search_log对应hdfs表存储路径中
load data inpath '/src/search_log.txt' into table search_log;
-- 4.查询数据
select * from search_log;
load上传Linux文件
-- 需求2: 直接把linux中最新的search_log.txt文件上传到search表对应hdfs路径中
-- 先把资料中search_log.txt文件传到linux中,例如:/root
-- load命令上传文件
load data local inpath '/root/search_log.txt' overwrite into table search_log;

-- 查看最终数据
select * from search_log;

3.insert插入数据

从其他表查询数据'追加'插入到当前表中: insert into [table] 表名 select 语句;

从其他表查询数据'覆盖'插入到当前表中: insert overwrite table 表名 select 语句;

insert追加数据
-- 需求1:创建一个search_log_copy表,然后从search_log查询数据插入到新表中
create table search_log_copy(
    dt string,
    uid string,
    word string,
    url string
)row format delimited
fields terminated by '\t';

-- 从search_log表中查所有数据,直接插入到search_log_copy表
insert into table search_log_copy select * from search_log;
-- 查看数据
select * from search_log_copy;
insert覆盖数据
-- 需求2: 假设search_log表中数据改变了,要求把最新的数据更新到search_log_copy表中
insert overwrite table search_log_copy select * from search_log;
-- 查看数据
select * from search_log_copy;

文件数据导出

1.直接下载文件

web页面下载

需求: 已知search_log.txt文件在HFDS的/user/hive/warehouse/hive02.db/search_log路径下,要下载到window系统

 

 get命令下载文件

需求: 已知search_log.txt文件在HFDS的/user/hive/warehouse/hive02.db/search_log路径下,要下载到linux系统

[root@node1 binzi]# hdfs dfs -get /user/hive/warehouse/hive02.db/search_log/search_log.txt /binzi

2.insert导出数据

查询数据导出到hdfs其他路径: insert overwrite directory 'hfds存储该数据路径' select语句;

查询数据导出到linux本地中: insert overwrite local directory 'linux存储该数据路径' select语句;

注意:  overwrite默认是覆盖重写,所以在指定存储该数据路径的时候尽量指定一个空的目录

注意: 导出数据的时候不指定分隔符采用默认分隔符SOH,0001,?...

导出数据指定分隔符添加: row format delimited fields terminated by '分隔符'

 insert导出到hdfs
-- 演示insert overwrite导出数据到文件
-- 语法:  insert overwrite [local] directory 文件存储路径 [指定分隔符] select语句;
-- 导出数据到hfds
-- 注意: 如果是根目录/,会自动创建-ext-10000目录存储生成的000000_0文件
-- 但是其他目录,会自动清空所有内容,再生成一个000000_0文件,所以注意导出目录尽量是一个新的空目录
-- 默认分隔符
insert overwrite  directory '/source' select * from search_log1;
-- 指定分隔符
insert overwrite  directory '/output'
    row format delimited fields terminated by ','
select * from search_log1;
insert导出Linux
-- 2.2导出到linux
-- [root@node1 ~]# mkdir /output
-- 导出到linux的/output目录下,自动生成000000_0文件存储查询结果
-- 默认分隔符
insert overwrite local directory '/output' select * from search_log1;
-- 指定分隔符
insert overwrite local directory '/output'
    row format delimited fields terminated by ','
select * from search_log1;

3.hive_shell命令

hive命令执行sql语句:  hive -e "sql语句" > 存储该结果数据的文件路径

hive命令执行sql脚本:  hive -f sql脚本文件 > 存储该结果数据的文件路径

 hql语句导出
# 以下命令都是在linux的shell命令行执行
# 3.1使用hive -e sql语句方式导出数据
[root@node1 ~]# hive -e 'select * from hive02.search_log;' > /home/hs1.txt
[root@node1 ~]# cat hs1.txt
hql脚本导出
# 3.2使用hive -f 脚本文件方式导出数据
[root@node1 ~]# echo 'select * from hive02.search_log;' > /home/export.sql
[root@node1 ~]# hive -f export.sql > /home/hs2.txt
[root@node1 ~]# cat hs2.txt

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

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

相关文章

Java中的多态究竟是什么?

目录 一.概念二.使用条件三.重写1.概念2.使用条件3.与重载对比4.举例5.为什么需要重写1.重写规则 2.静态绑定--重载3.动态绑定--重写 四.向上转型第一种传参方式:直接赋值第二种传参方式:通过传参优缺点 五.向下转型举例缺点 六.多态的优缺点优点缺点 一…

ros1 基础学习08- 实现Server端自定义四 Topic模式控制海龟运动

一、服务模型 Server端本身是进行模拟海龟运动的命令端,它的实现是通过给海龟发送速度(Twist)的指令,来控制海龟运动(本身通过Topic实现)。 Client端相当于海龟运动的开关,其发布Request来控制…

Leetcode2833. 距离原点最远的点

Every day a Leetcode 题目来源:2833. 距离原点最远的点 解法1:贪心 要使得到达的距离原点最远的点,就看 left 和 right 谁大,将 left 和 right 作为矢量相加,再往同方向加上 underline。 答案即为 abs(left - rig…

vue-入门介绍

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容,初识vue入门到项目实战详解 目录 一.Vue介绍 二.初识Vue 工具安装 创建项目 目录结构介绍 项…

Adobe premiere裁剪视频尺寸并转为GIF格式

第一步:裁剪视频 修改序列设置以适应裁剪之后的图像区域;序列中的编辑模式不能使用默认的,这里使用的是“DNxHR_2K” 第二步:导出设置

SpringBoot集成easyexcel实现动态模板导出

添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-o…

AlGaN/GaN HFET 五参数模型

标题&#xff1a;A Five-Parameter Model of the AlGaN/GaN HFET 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;15年&#xff09; 摘要—我们引入了AlGaN/GaN异质结场效应晶体管&#xff08;HFET&#xff09;漏极电流Id&#xff08;Vgs&#xff0c;Vds…

【Linux】Linux 中关于 MySQL 的相关操作

Linux 中关于 MySQL 的相关操作 Linux 系统与 MySQL 数据库是目前互联网开发中最为流行的组合之一。Linux 作为开源的操作系统&#xff0c;具有运行效率高、安全性好等优点&#xff1b;而 MySQL 作为开源的数据库&#xff0c;具有运行速度快、可靠性高等特点。 &#xff08;1&…

Spring Boot (三)

1、热部署 热部署可以替我们节省大把花在重启项目本身上的时间。热部署原理上&#xff0c;一个springboot项目在运行时实际上是分两个过程进行的&#xff0c;根据加载的东西不同&#xff0c;划分成base类加载器与restart类加载器。 base类加载器&#xff1a;用来加载jar包中的类…

个人技术支持

本人目前从事 cnc 自动编程相关职业&#xff0c;主要还是做上位机开发&#xff0c;2021年之前一直从事 Unity3d 开发&#xff0c;本来也是个游戏程序员&#xff0c;后面也是大环境不好&#xff0c;改做了上位机开发&#xff0c;没想到上位机行业现在也是这么不好找工作。 最近…

数据挖掘:分类,聚类,关联关系,回归

数据挖掘&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&…

计算机中怎么依据字节数组找到对应的字符

问题引入 将中文字符“你”用UTF-8编码转成字节数组后&#xff0c;为什么是这样的三个数字&#xff1f; byte[] bytes "你".getBytes(StandardCharsets.UTF_8);for (byte t:bytes){System.out.println(t);} 打印的结果如下&#xff1a; -28 -67 -96 你有没有很好…

多测师肖sir_高级金牌讲师_ui自动化po框架版本01

ui自动化po框架 一、po框架 1、基本介绍 &#xff08;1&#xff09;po模式是page object model的缩写&#xff08;简称&#xff1a;po或pom&#xff09; &#xff08;2&#xff09; po模式的核心思想&#xff1a;分层&#xff0c;实现耦合 实现&#xff1a;业务流程与页面元素操…

基于java+springboot+vue的幼儿园信息网站

项目介绍 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于幼儿园管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了幼儿园管理系统&#xff0c;它彻底改变了过…

[LeetCode] 5.最长回文子串

一、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba&…

Python零基础小白常遇到的问题总结

文章目录 一、注意你的Python版本1.print()函数2.raw_input()与input()3.比较符号&#xff0c;使用!替换<>4.repr函数5.exec()函数 二、新手常遇到的问题1、如何写多行程序&#xff1f;2、如何执行.py文件&#xff1f;3、and&#xff0c;or&#xff0c;not4、True和False…

C语言----静态链接库和动态链接库

在前面的文章中讲到可执行程序的生成需要经过预处理&#xff0c;编译&#xff0c;汇编和链接四个步骤&#xff0c;链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。 需要解读一下库文件&#xff0c;我们可以将库文件等价为压缩包文件&…

【电路笔记】-节点电压分析和网状电流分析

节点电压分析和网状电流分析 文章目录 节点电压分析和网状电流分析1、节点电压分析1.1 概述1.2 示例 2、网格电流分析2.1 概述2.2 示例 3、总结 正如我们在上一篇介绍电路分析基本定律的文章中所看到的&#xff0c;基尔霍夫电路定律 (KCL) 是计算任何电路中未知电压和电流的强大…

基于STC12C5A60S2系列1T 8051单片机串口通信信应用

基于STC12C5A60S2系列1T 8051单片机串口通信应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器列表基于STC12C5A60S2系列1T 8051单片…

基于DS1302时钟液晶12864显示2路闹钟仿真及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302采集年月日时分秒送到液晶12864显示。 3、按键年月日时分秒&#xff0c;两路闹钟。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 uchar clock_time[6] {0X00,0X59,0X23,0X09,0X…