【Python大数据笔记_day07_hive中的分区表、分桶表以及一些特殊类型】

news2024/11/16 11:49:36

分区表

 分区表的特点/好处:需要产生分区目录,查询的时候使用分区字段筛选数据,避免全表扫描从而提升查询效率

效率上注意:如果分区表在查询的时候呀没有使用分区字段去筛选数据,效率不变

分区字段名注意:分区字段名不能和原有的字段名重复,因为分区字段名要作为字段拼接到表后

 一级分区

创建分区表:create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... )partitioned by (分区字段名 分区字段类型)... ; 

自动生成分区目录并插入数据: load data [local] inpath '文件路径' into table 分区表名 partition (分区字段名='值');

注意: 如果加local后面文件路径应该是linux本地路径,如果没有加那么就是hdfs文件路径

-- 创建库使用库
create database hive3;
use hive3;
-- 演示分区表
-- 1.一级分区表
-- 建表
create table one_part_order(
    oid string,
    name string,
    price double,
    num int
)partitioned by (year string)
    row format delimited
fields terminated by ' ';
-- 加载数据
-- 先在hdfs的source目录下准备好订单相关数据文件
-- 使用load加载数据到分区表中
load data inpath '/source/order202251.txt' into table one_part_order partition (year=2022);
load data inpath '/source/order2023415.txt' into table one_part_order partition (year='2023');
load data inpath '/source/order202351.txt' into table one_part_order partition (year='2023');
load data inpath '/source/order202352.txt' into table one_part_order partition (year='2023');
-- 验证数据
select * from one_part_order limit 20;

/*分区表特点
去hdfs验证分区表的本质就是分目录存储各个小文件
通过查询发现分区字段最终效果作为一个字段拼接到表最后
*/
-- 分区表的好处:避免全表扫描,提升查询效率
select * from one_part_order where year='2022';
-- 注意: 如果查询的时候条件不是分区字段,效率不会改变
select * from one_part_order where price=20;

 多级分区

创建分区表: create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... )partitioned by (一级分区字段名 分区字段类型, 二级分区字段名 分区字段类型 , ...) ; 

自动生成分区目录并插入数据: load data [local] inpath '文件路径' into table 分区表名 partition (一级分区字段名='值',二级分区字段名='值' , ...);

注意: 如果加local后面文件路径应该是linux本地路径,如果没有加那么就是hdfs文件路径

-- 2.多级分区表
-- 创建表
create table multi_part_order(
    oid string,
    name string,
    price float,
    num int
)partitioned by (year string,month string,day string)
    row format delimited
fields terminated by ' ';
-- 加载数据
-- 思考数据文件在哪里?如果想从hdfs加载,怎么操作?上传到hdfs指定位置
load data inpath '/source/order202251.txt' into table multi_part_order partition (year=2022,month=05,day=01);
load data inpath '/source/order202351.txt' into table multi_part_order partition (year=2023,month=05,day=01);
load data inpath '/source/order202352.txt' into table multi_part_order partition (year=2023,month=05,day=02);
load data inpath '/source/order2023415.txt' into table multi_part_order partition (year=2023,month=04,day=15);
-- 验证数据
select * from multi_part_order;

-- 分区表的好处:避免全表扫描,提升查询效率
-- 需求: 统计2023年商品总销售额
select sum(price*num) from multi_part_order where year='2023'; -- 提升效率
-- 需求: 统计2023年5月份商品总销售额
select sum(price*num) from multi_part_order where year='2023'and month='5'; -- 提升效率
-- 需求: 统计2023年5月1日的商品总销售额
select sum(price*num) from multi_part_order where year='2023'and month='5' and day='1'; -- 提升效率

 分区操作

添加分区: alter table 分区表名 add partition (分区字段名='值' , ...);

删除分区: alter table 分区表名 drop partition (分区字段名='值' , ...);

修改分区名: alter table 分区表名 partition (分区字段名='旧值' , ...) rename to partition (分区字段名='新值' , ...);

查看所有分区: show partitons 分区表名;

同步/修复分区: msck repair table 分区表名;

-- 分区操作
-- 注意: 先确定有一级分区和多级分区表,如果没有先创建再做分区操作
select * from one_part_order limit 20;
select * from multi_part_order limit 20;

-- 添加分区(本质在hdfs上创建分区目录)
alter table one_part_order add partition (year=2024);
alter table multi_part_order add partition (year=2024,month=5,day=1);

-- 修改分区(本质在hdfs上修改分区目录名)
alter table one_part_order partition (year=2024) rename to partition (year=2030);
alter table multi_part_order  partition (year=2024,month=5,day=1) rename to partition (year=2030,month=6,day=10);

-- 查看所有分区
show partitions one_part_order;
show partitions multi_part_order;

-- 删除分区
alter table multi_part_order drop partition (year=2030,month=6,day=10);
alter table multi_part_order drop partition (year=2023,month=5,day=2);
alter table multi_part_order drop partition (year=2023,month=5);
alter table multi_part_order drop partition (year=2023,month=4);
alter table multi_part_order drop partition (year=2022);

-- 如果在hdfs上创建符合分区目录格式的文件夹,可以使用msck repair修复
-- 举例:手动创建一个year=2033目录
msck repair table one_part_order;
msck repair table multi_part_order;
-- 修复后再次查看所有分区
show partitions one_part_order;
show partitions multi_part_order;

 Hadoop_hive文档

hive文档: https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
hdfs文档: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
yarn文档: https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
mr文档: https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

 分桶表

 分桶表特点/好处:需要产生分桶文件,查询的时候特定操作上提升效率(过滤,join,分组以及抽样)

效率上注意:如果分桶表在查询数据的时候没有使用分桶字段去筛选,效率不变

分桶字段名注意:分桶字段名必须是原有的字段名,因为分桶需要根据对应的字段值取余数把余数相同的数据放到一个桶文件中

重要参数

-- 默认开启,hive2.x版本已经被移除
set hive.enforce.bucketing; -- 查看未定义因为已经被移除
set hive.enforce.bucketing=true; -- 修改

-- 查看reduce数量
-- 参数优先级: set方式 > hive文档 > hadoop文档
set mapreduce.job.reduces; -- 查看默认-1,代表自动根据桶数量匹配reduce数量
set mapreduce.job.reduces=3; -- 设置参数

 基础分桶表

创建基础分桶表:  
create [external] table [if not exists] 表名(
    字段名 字段类型 
)
clustered by (分桶字段名) 
into 桶数量 buckets ;

-- 1.创建基础分桶表,要求分3个桶
create table course_base (
    cid int,
    cname string,
    sname string
)
clustered by(cid) into 3 buckets
row format delimited fields terminated by '\t';

-- 2.load方式加载数据
-- 前提: 已经上传course.txt文件到hdfs的/source目录下
load data inpath '/source/course.txt' into table course_base;

-- 3.查询数据,观察结果
select * from course_base;

分桶表排序

创建基础分桶表,然后桶内排序:   
create [external] table [if not exists] 表名(
    字段名 字段类型 
)
clustered by (分桶字段名) 
sorted by(排序字段名 asc|desc)   # 注意:asc升序(默认) desc降序
into 桶数量 buckets ;

-- 1.创建基础分桶表,要求分3个桶,桶内根据cid降序
create table course_sort (
    cid int,
    cname string,
    sname string
)
clustered by(cid) sorted by (cid desc) into 3 buckets
row format delimited fields terminated by '\t';

-- 2.加载数据
-- 还是使用/source/course.txt数据文件
load data inpath '/source/course.txt' into table course_sort;

-- 3.查询数据,观察结果
select * from course_sort;

练习

一直课程表course.txt数据文件,要求建表,根据sname分桶,然后桶内再根据cid升序排序,观察结果

注意事项

数据倾斜问题:分桶字段值如果大量重复,相同的会分到同一个桶内,导致数据倾斜

-- 1.创建基础分桶表,要求分3个桶,桶内根据cid降序
create table course_test (
    cid int,
    cname string,
    sname string
)
clustered by(sname) sorted by (cid) into 3 buckets
row format delimited fields terminated by '\t';

-- 2.加载数据
-- 还是使用/source/course.txt数据文件
load data inpath '/source/course.txt' into table course_test;

-- 3.查询数据,观察结果
select * from course_test;

分桶原理

分桶原理:

如果是数值类型分桶字段:直接使用数值对桶数量取模

如果是字符串类型分桶字段:底层会使用hash算法计算出一个数字然后再对桶数量取模

Hash:Hash是一种数据加密算法,其原理我们不去详细讨论,我们只需要知道其主要特征:同样的值被hash加密后的结果是一致的

举例:字符串'binzi'被hash后的结果是93742710(仅作为示意),那么无论计算多少次,字符串“binzi”的结果都会是93742710。
计算余数: hash('binzi')%3==0  
注意: 同样的数据得到的结果一致,如’binzi’ hash取模结果是0,无论计算多少次,它的取模结果都是0

 分区表和分桶表的区别

分区表
    创建表的时候使用关键字: partition by (分区字段名 分区字段类型)
    分区字段名注意事项: 是一个新的字段,需要指定类型,且不能和其他字段重名
    分区表好处: 使用分区字段作为条件的时候,底层直接找到对应的分区目录,能够避免全表扫描,提升查询效率
    分区表最直接的效果: 在hfds表目录下,分成多个分区目录(year=xxxx,month=xx,day=xx)
    不建议直接上传文件在hdfs表根路径下: 分区表直接不能识别对应文件中数据,因为分区表会找分区目录下的数据文件
    使用load方式加载hdfs中文件: 本质是移动文件到对应分区目录下

分桶表
    创建表的时候使用关键字: clustered by (分桶字段名) into 桶数量 buckets
    分桶字段名注意事项: 是指定一个已存在的字段,不需要指定类型
    分桶表好处: 使用分桶字段做抽样等特定操作的时候,也能提升性能效率
    分桶表最直接的效果: 在hdfs表目录或者分区目录下,分成多个分桶文件(000000_0,000001_0,000002_0...)
    不建议直接上传文件在hdfs表根路径下: 分桶表可以识别对应文件中数据,但是并没有分桶效果,也是不建议的
    使用load方式加载hdfs中文件: 本质是复制数据到各个分桶文件中

 复杂类型

hive的SerDe机制

其中ROW FORMAT是语法关键字,DELIMITED和SERDE二选其一。本次我们主要学习DELIMITED关键字相关知识点
如果使用delimited: 表示底层默认使用的Serde类:LazySimpleSerDe类来处理数据。
如果使用serde:表示指定其他的Serde类来处理数据,支持用户自定义SerDe类。

Hive默认的序列化类: LazySimpleSerDe
包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号。
在建表的时候可以根据数据的类型特点灵活搭配使用。
COLLECTION ITEMS TERMINATED BY '分隔符' : 指定集合类型(array)/结构类型(struct)元素的分隔符
MAP KEYS TERMINATED BY '分隔符' : 表示映射类型(map)键值对之间用的分隔

 复杂类型

复杂类型建表格式: 
...
[row format delimited] # hive的serde机制
    [fields terminated by '字段分隔符'] # 自定义字段分隔符固定格式
    [collection ITEMS terminated by '集合分隔符'] # 自定义array同类型集合和struct不同类型集合
    [map KEYS terminated by '键值对分隔符'] # 自定义map映射kv类型
    [lines terminated by '\n'] # # 默认即可
...;

hive复杂类型:   array  struct  map

array类型: 又叫数组类型,存储同类型的单数据的集合
     建表指定类型:  array<数据类型>
     取值: 字段名[索引]   注意: 索引从0开始
     获取长度: size(字段名)
     判断是否包含某个数据: array_contains(字段名,某数据)

struct类型: 又叫结构类型,可以存储不同类型单数据的集合
     建表指定类型: struct<子字段名1:数据类型1, 子字段名2:数据类型2 , ...>
     取值: 字段名.子字段名n
    
map类型: 又叫映射类型,存储键值对数据的映射(根据key找value)
    建表指定类型: map<key类型,value类型>
    取值: 字段名[key]
    获取长度: size(字段名)
    获取所有key: map_keys()
    获取所有value: map_values()

 srray示例

需求:已知data_for_array_type.txt文件,存储了学生以及居住过的城市信息,要求建hive表把对应的数据存储起来

-- 演示使用简单类型映射数据
-- 创建表
create table test_array1(
    name string,
    location string
)row format delimited
fields terminated by '\t';
-- 加载数据
load data inpath '/source/data_for_array_type.txt' into table test_array1;
-- 验证数据
select * from test_array1;


-- 演示使用array类型映射数据
-- 创建表
create table test_array2(
    name string,
    location array<string>
)row format delimited
fields terminated by '\t'
collection items terminated by ',';
-- 加载数据
load data inpath '/source/data_for_array_type.txt' into table test_array2;
-- 验证数据
select * from test_array2;

-- 需求: 查询zhangsan的地址有几个?
select size(location) from test_array2 where name = 'zhangsan';
-- 需求: 查询zhangsan的第二个地址?
select location[1] from test_array2 where name = 'zhangsan';
-- 需求: 查询zhangsan是否在tianjin住过?
select array_contains(location,'tianjin') from test_array2 where name = 'zhangsan';

struct示例

 需求: 已知data_for_struct_type.txt文件存储了用户姓名和年龄基本信息,要求建hive表把对应的数据存储起来

-- 演示使用简单类型映射数据
-- 创建表
create table test_struct1(
    id int,
    info string
)row format delimited
fields terminated by '#';
-- 加载数据(前提hdfs必须有对应文件)
load data inpath '/source/data_for_struct_type.txt' into table test_struct1;
-- 验证数据
select * from test_struct1;

-- 演示struct类型映射数据
-- 创建表
create table test_struct2(
    id int,
    info struct<name:string,age:int>
)row format delimited
fields terminated by '#'
collection items terminated by ':';
-- 加载数据(前提hdfs必须有对应文件)
load data inpath '/source/data_for_struct_type.txt' into table test_struct2;
-- 验证数据
select * from test_struct2;

-- 需求: 获取所有的姓名
select info.name from test_struct2;
-- 需求: 获取所有的年龄
select info.age from test_struct2;

 map示例

 需求: 已知data_for_map_type.txt文件存储了每个学生详细的家庭信息,要求建hive表把对应数据存储起来

-- 演示简单类型映射数据
-- 创建表
create table test_map1(
    id int,
    name string,
    info string,
    age int
)row format delimited
fields terminated by ',';
-- 加载数据(前提hdfs有对应数据文件)
load data inpath '/source/data_for_map_type.txt' into table test_map1;
-- 验证数据
select * from test_map1;

-- 演示map类型的应用
-- 创建表
create table test_map2(
    id int,
    name string,
    info map<string,string>,
    age int
)row format delimited
fields terminated by ','
collection items terminated by '#'
map keys terminated by ':';
-- 加载数据(前提hdfs有对应数据文件)
load data inpath '/source/data_for_map_type.txt' into table test_map2;
-- 验证数据
select * from test_map2;

-- 需求: 查看所有人的father,mother信息
select name,info['father'] as father ,info['mother'] as mother from test_map2;
-- 需求: 查看所有人的家庭相关角色
select name,map_keys(info) from test_map2;
-- 需求: 查看所有人的家庭相关姓名
select name,map_values(info) from test_map2;
-- 需求: 查看所有人的家庭相关人员个数
select name,size(info) as cnt from test_map2;
-- 需求: 查看马大云是否包含brother角色
select name,array_contains(map_keys(info),'brother') 
from test_map2 where name = '马大云';

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

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

相关文章

常见面试题-JDK和CGLIB动态代理

JDK 动态代理和 CGLIB 动态代理对比 JDK 动态代理只能代理实现了接口的类&#xff0c;而 CGLIB 可以代理未实现任何接口的类。另外CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用&#xff0c;因此不能代理声明为final 类型的类和方法就二者的效率来说&a…

信息系统项目管理师 教材目录、考试大纲、考情

文章目录 考情考试大纲第1章 信息化发展第2章 信息技术发展第3章 信息系统治理第4章 信息系统管理第5章 信息系统工程第6章 项目管理概论第7章 项目立项管理第8章 项目整合管理第9章 项目范围管理272第10章 项目进度管理297第11章 项目成本管理334第12章 项目质量管理358第13章…

【图像卷积与卷积层】的基本概念与区别

图像卷积 卷积操作是指将一个滤波器&#xff08;也称为卷积核或内核&#xff09;应用于输入图像的小块区域&#xff0c;然后将滤波器在整个图像上滑动&#xff0c;逐步计算出输出特征图。这个过程可以帮助网络学习到图像的局部特征&#xff0c;因为每个卷积核都可以学习到不同…

VulnHub Prime_Series_Level-1

一、信息收集 1.nmap扫描 ┌──(root&#x1f480;kali)-[~/桌面] └─# arp-scan -l┌──(root&#x1f480;kali)-[~/桌面] └─# nmap -sS -A -p- 192.168.103.202发现开放了22和80端口 2.web页面 打开80端口的web页面&#xff0c;是一张静态的图片&#xff0c;没什么价…

【Seata源码学习 】 扫描@GlobalTransaction注解 篇一

1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制&#xff0c;在应用上下文启动时&#xff0c;会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…

探寻知识的新路径——电大搜题助您开启学习新纪元

江西开放大学和广播电视大学一直以来都是许多自学者和职场人士追寻知识的圣地。然而&#xff0c;对于许多学子来说&#xff0c;学习的过程也常常充满了困惑和挑战。为了帮助这些学习者通过更高效、便捷的方式获取知识&#xff0c;江西开放大学推出了一款创新的学习工具——电大…

谈谈越来越无效的拥塞控制

简单看一个图&#xff1a; 它不是互联网本身&#xff0c;但这是典型网络的必要组件&#xff0c;它决定了 flow 如何从从一边流向另一边&#xff1a;一条 flow 经过交换节点通过 NIC 被导入一条链路前在 buffer 中排队。 现如今大多数工程师的工作都在折腾那个单独的盒子&…

231112-中文错别字识别与纠正问题的大模型与小模型调研

A. 引言 当前&#xff0c;以ChatGPT为代表的大语言模型&#xff08;Large Language Models, LLMs&#xff09;正引领着新一轮工业革命。ChatGPT最开始的研究领域隶属于NLP的一个子问题&#xff0c;其输入是text&#xff0c;输出也是text。在从文本输入到文本输出的诸多应用场景…

C语言从入门到精通之【概述】

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

Smart Link 和 Monitor Link应用

定义 Smart Link常用于双上行链路组网&#xff0c;提高接入的可靠性。 Monitor Link通过监视上行接口&#xff0c;使下行接口同步上行接口状态&#xff0c;起到传递故障信息的作用。 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个…

木疙瘩踩坑日记-容易忽略的一些BUG

在一开始玩家务必很清楚这三个概念 图形&#xff1a;舞台上元素的最小单位。软件自带的以及外部导入的图片默认都是图形&#xff01;最朴素的元素&#xff01;可以添加预制动画、关键帧动画、进度动画&#xff08;软件自带的形状&#xff09; 元件&#xff1a;一个可以内部封…

高性能收发原始数据包的框架(Netmap)

一、Netmap 简介 Netmap 是一个高性能收发原始数据包的框架&#xff0c;由 Luigi Rizzo 等人开发完成&#xff0c;其包含了内核模块以及用户态库函数。其目标是&#xff0c;不修改现有操作系统软件以及不需要特殊硬件支持&#xff0c;实现用户态和网卡之间数据包的高性能传递。…

Git系列之分支与标签的使用及应用场景模拟

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…

【网络奇遇记】我和因特网的初相遇2 —— 三种交换方式

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 前言一. 电路交换1.1 电路交换讲解1.2 电路交换实例 二. 分组交换1.1 分组交换讲解1.2 分组交换实例…

Go 14岁了

今天我们庆祝Go开源十四周年&#xff01;Go度过了美好的一年&#xff0c;发布了两个功能齐全的版本和其他重要的里程碑。 我们在2月份发布了Go 1.20&#xff0c;在8月份发布了Go 1.21&#xff0c;更多地关注实现改进而不是新的语言更改。 在Go 1.20中&#xff0c;我们预览了配置…

基于Python+Django的图书管理系统

项目介绍 图书是人类文明传播的一个重要方式&#xff0c;很多历史悠久的文明都是通过图书来进行传递的&#xff0c;虽然随着时代的进步电子信息技术发展很快&#xff0c;但是纸质图书的地位仍然是非常稳固的&#xff0c;为了能够让知识拥有更加快捷方便的传递方式我们开发了本…

Typora-PicGo-七牛云图床

Typora-PicGo-七牛云图床 问题描述&#xff1a; 每次使用Typora写完笔记后&#xff0c;想要将笔记上传至CSDN会发现一个问题&#xff0c;由于没有配置图床&#xff0c;笔记中的图片需要一张一张的上传到CSDN&#xff0c;非常麻烦&#xff0c;若使用PicGo并搭配七牛云的10G免费…

Django配置文件,request,链接mysql方法,Orm简介

三板斧问题(views.py) HttpResponse # 返回的是字符串render # 渲染一个HTML静态文件&#xff0c;模板文件redirect # 重定向的 在视图文件中得视图函数必须要接收一个形参request&#xff0c;并且&#xff0c;视图函数也要有返回值&#xff…

Linux - 基础IO(重定向 - 重定向模拟实现 - shell 当中的 重定向)- 下篇

前言 上一篇博客当中&#xff0c;我们对 文件 在操作系统当中是 如何就管理的&#xff0c;这个问题做了 详细描述&#xff0c;本篇博客将基于上篇 博客当中的内容进行 阐述&#xff0c;如有疑问&#xff0c;请参考上篇博客&#xff1a; Linux - 基础IO&#xff08;Linux 当中…

matlab 多自由度的车辆垂向振动模型 车辆平稳性研究

1、内容简介 略 17-可以交流、咨询、答疑 多自由度的车辆垂向振动模型 多自由度的车辆垂向振动模型&#xff0c;包含四分之一车体模型、半车模型和整车模型 垂向振动模型、四分之一车体模型、半车模型和整车模型 2、内容说明 略 3、仿真分析 略 4、参考论文 略 链接&…