2023.11.13 hive数据仓库之分区表与分桶表操作,与复杂类型的运用

 

目录

 

0.hadoop hive的文档

1.一级分区表

2.一级分区表练习2

 3.创建多级分区表

4.分区表操作

5.分桶表

6. 分桶表进行排序

7.分桶的原理

 8.hive的复杂类型

9.array类型: 又叫数组类型,存储同类型的单数据的集合

 10.struct类型: 又叫结构类型,可以存储不同类型单数据的集合

 11.map类型: 又叫映射类型,存储键值对数据的映射(根据key找value)


0.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

1.一级分区表

创建分区表: 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 [external] table [if not exists]
-- 表名(字段名 字段类型 , 字段名 字段类型 , ... )
-- partitioned by (分区字段名 分区字段类型) ;-- 自动生成分区目录并插入数据: load data [local] inpath
-- '文件路径' into table 分区表名 partition (分区字段名='值');--建表
create table if not exists
score (name string,subject string,grade int)
partitioned by (dt string)
row format delimited
fields terminated by '\t'
;

此为score.txt文件 

--在hdfs的网页中手动上传score.txt到目录,下面每一次load data都会把这个文件移动
-- 加载数据
load data inpath '/score.txt' into table score partition (dt='2022');
load data inpath '/score.txt' into table score partition (dt='2023');
load data inpath '/score.txt' into table score partition (dt='2024');

--查询数据
select  * from score;--此时dt的三个年份都存在了这个表里
--如,查询2023年的数据,效率提升
select * from score where dt = '2023';
select * from score where dt = '2022';
select * from score where dt = '2024';

 

可以直接根据年份作为条件来查询表的内容,结果如下

 

2.一级分区表练习2

 1.建表

--练习2建一个新表,-- 创建分区表: create [external] table [if not exists]
-- 表名(字段名 字段类型 , 字段名 字段类型 , ... )
-- partitioned by (分区字段名 分区字段类型) ;
--建表
create table one_part_order(oid string,name string,price double,num int
)partitioned by (year string)
row format delimited
fields terminated by ' ';

2.加载数据

四个order.txt文件如下

--加载数据,现在hdfs中准备好文件,再使用load加载数据到分区表中
load data inpath '/itcast/order202251.txt'into table one_part_order partition (year='2022');load data inpath '/itcast/order2023415.txt'into table one_part_order partition (year='2023');load data inpath '/itcast/order202351.txt'into table one_part_order partition (year='2023');load data inpath '/itcast/order202352.txt'into table one_part_order partition (year='2023');

 3.验证数据

select * from one_part_order ;
select * from one_part_order where year = '2023';

 

 3.创建多级分区表

创建分区表: create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... )partitioned by (一级分区字段名 分区字段类型, 二级分区字段名 分区字段类型 , ...) ; 自动生成分区目录并插入数据: load data [local] inpath '文件路径' into table 分区表名 partition (一级分区字段名='值',二级分区字段名='值' , ...);注意: 如果加local后面文件路径应该是linux本地路径,如果没有加那么就是hdfs文件路径

 1.建表


--删表
drop table more_part_order;
truncate table multi_part_order;
--建表
create table multi_part_order(oid string,pname string,price double,num int)partitioned by (year string,month string,day string)
row format delimited
fields terminated by ' ';

或者

--建表
create table multi_part1_order(oid string,pname string,price double,num int)partitioned by (year string,month string,day string)
row format delimited
fields terminated by ' ';

 

2.加载数据

--加载数据
load data inpath '/itcast/order202251.txt' into tablemulti_part_order partition (year='2022',month='05',day='01');load data inpath '/itcast/order2023415.txt' into tablemulti_part_order partition (year='2023',month='04',day='15');load data inpath '/itcast/order202351.txt' into tablemulti_part_order partition (year='2023',month='05',day='01');load data inpath '/itcast/order202352.txt' into tablemulti_part_order partition (year='2023',month='05',day='02');

或者

 

--加载数据
load data inpath '/itcast/order202251.txt' into tablemulti_part1_order partition (year='2022',month='2022-05',day='2022-05-01');load data inpath '/itcast/order2023415.txt' into tablemulti_part1_order partition (year='2023',month='2023-04',day='2023-04-15');load data inpath '/itcast/order202351.txt' into tablemulti_part1_order partition (year='2023',month='2023-05',day='2023-05-01');load data inpath '/itcast/order202352.txt' into tablemulti_part1_order partition (year='2023',month='2023-05',day='2023-05-02');

 3.验证数据

--验证数据
select * from multi_part1_order;
select * from multi_part1_order where day = '2023-05-01';

 需求1:查询日期为2023年5月1日的商品

 需求2:统计日期2023年5月1日的商品销售额

--统计2023年5月1日,商品的销售额
select sum(price*num)  as money from multi_part_orderwhere year='2023'and month='05'and day='01';

 

4.分区表操作

 添加,删除

--------------------------------分区表操作------------------------------
--添加分区:alter table 分区表名 add partition (分区字段名='值',....);
select * from multi_part1_order;
alter table multi_part1_order add partition (year='2024',month='5',day='01');
--删除分区:alter table 分区表名 drop partition(分区字段名='值',....);
alter table multi_part1_order drop partition (year='2024');
alter table multi_part1_order drop partition (year='2024',month='5',day='01');
alter table multi_part1_order drop partition (year='2024',month='5');

 修改

--修改分区:alter table 分区表名 partition  (分区字段名='旧值' , ...)rename to partition (分区字段名='新值' , ...);
alter table multi_part1_order partition (year='2024',month='5',day='01')rename to partition (year='2030',month='5',day='01');
--本质上是改了原本day01,被移动.并新增了year=2024的目录

查看

-- 查看所有分区: show partitons 分区表名;
show partitions multi_part1_order;
-- 同步/修复分区: msck repair table 分区表名;
msck repair table multi_part1_order;

5.分桶表

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

into 桶数量 buckets ;

 1.建表

- 创建基础分桶表:
-- create [external] table [if not exists] 表名(字段名 字段类型)clustered by (分桶字段名)into 桶数量 buckets ;
--建表
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 data inpath '/itcast/course.txt'into table course_base;

3.验证数据

--验证数据
select * from course_base;
--取余数:12/3余0, 9/3余0 , 6/3余0 , 3/3余0  ,1/3余1 ,13/3余1....

6. 分桶表进行排序

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

1.创建表

--创建分桶表
truncate table course_sort;
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.加载数据

--加载数据
load data inpath '/input/course.txt'into table course_sort;
 

3. 验证数据

--验证数据
select * from course_sort ;
--生成的三个文件,000000_0   ,    000001_0,     000002_0
--验证余数:12/3=0 9/3=0 6/3=0 3/3=0
-- 13/3=1 10/3=1 7/3=1 4/3=1 1/3的结果是0,余1
-- 14/3=2 11/3=2 8/3=2 5/3=2

 

7.分桶的原理

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

Hash: Hash是一种数据加密算法,其原理我们不去详细讨论,我们只需要知道其主要特征:同样的值被Hash加密后的结果是一致的
举例: 字符串“binzi”被Hash后的结果是93742710(仅作为示意),那么无论计算多少次,字符串“binzi”的结果都会是93742710。
计算余数: hash('binzi')%3==0  
注意: 同样的数据得到的结果一致,如’binzi’ hash取模结果是0,无论计算多少次,它的取模结果都是0

 8.hive的复杂类型

---------------------------复杂类型建表格式------------------------
-- 复杂类型建表格式:[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

9.array类型: 又叫数组类型,存储同类型的单数据的集合

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

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

1.创建表

----建表,
create table test_array_1(name string,location array<string>
)row format delimited
fields terminated by '\t'
collection items terminated by ',';

2.加载数据

--加载数据
load data inpath '/itcast/data_for_array_type.txt' into table test_array_1;

 3.验证数据

--验证数据
select * from test_array_1;
--zhangsan,"[""beijing"",""shanghai"",""tianjin"",""hangzhou""]"
--wangwu,"[""changchun"",""chengdu"",""wuhan"",""beijin""]"

4.需求:查询张三是否在天津住过?

select array_contains(location,'tianjin')from test_array_1 where name = 'zhangsan';
--结果:true

5. 需求:查询张三的地址有几个?

select size(location)from test_array_1 where name = 'zhangsan';
--结果:4

6.需求:查询王五的第二个地址?

select location[1] from test_array_1 where name = 'wangwu';
--结果:chengdu

 10.struct类型: 又叫结构类型,可以存储不同类型单数据的集合

--   建表指定类型: struct<子字段名1:数据类型1, 子字段名2:数据类型2 , ...>
--      取值: 字段名.子字段名n

1.建表

-- 建表
create table test_struct_1(id int,name_info struct<name:string,age:int>
)row format delimited fields terminated by '#'
collection items terminated by ':';

2.加载数据

--加载数据
load data inpath '/itcast/data_for_struct_type.txt' into table test_struct_1;

3.验证数据

--验证数据
select * from test_struct_1;

 

需求1:查询所有用户姓名

select name_info.name from test_struct_1;

需求2:查询所有的用户年龄

select name_info.age from test_struct_1;

需求3:查询所有用户的平均年龄

 

 11.map类型: 又叫映射类型,存储键值对数据的映射(根据key找value)

--  建表指定类型: map<key类型,value类型>
--     取值: 字段名[key]
--     获取长度: size(字段名)
--     获取所有key: map_keys()
--     获取所有value: map_values()

1.创建表

--创建表
create table test_map_1(id int,name string,members map<string,string>,age int
)row format delimited
fields terminated by ','
collection items terminated by '#'
map keys terminated by ':';

2.加载数据

-- 加载数据
load data inpath '/itcast/data_for_map_type.txt'into table test_map_1;

3.验证数据

--验证数据
select * from test_map_1;
-- 1,林杰均,"{""father"":""林大明"",""mother"":""小甜甜"",""brother"":""小甜""}",28
-- 2,周杰伦,"{""father"":""马小云"",""mother"":""黄大奕"",""brother"":""小天""}",22
-- 3,王葱,"{""father"":""王林"",""mother"":""如花"",""sister"":""潇潇""}",29
-- 4,马大云,"{""father"":""周街轮"",""mother"":""美美""}",26

 需求1:查询每个学生的家庭成员关系(就是所有的key)

select name,map_keys(members) from test_map_1;

需求2:查询每个学生的家庭成员姓名(就是所有的value)

select name ,map_values(members) from test_map_1;

需求3:查询每个学生和对应的父亲名字

select name,members['father'] as father from test_map_1;

需求4:查询马大云是否有兄弟

select name,array_contains(map_keys(members),'brother') from test_map_1 where name ='马大云';

 

-- 需求5:查询每个学生的对应brother姓名,没有brother的学生null补全-- 需求6:查询每个学生的对应brother姓名,没有brother的学生直接不显示

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

按键编程 pal库和标准库

按钮的电路设计 电路的搭建 原理与编程 创建了两个变量 用来捕捉按键的状态 先让两个变量都为1 previous和current都为1 &#xff08;按键没按下&#xff09; 然后让current去捕捉按键的状态通过读gpioA的pin0 如果为0就是按键按下 如果为1就是按键没按下 然后赋值给current …

asp.net core weapi 结合identity完成登录/注册/角色/权限分配

1.安装所需要的nuget包 <PackageReference Include"Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version"6.0.24" /><PackageReference Include"Microsoft.EntityFrameworkCore" Version"6.0.24" /><PackageR…

layui 表格(table)合计 取整数

第一步 开启合计行 是否开启合计行区域 table.render({elem: #myTable, url: ../baidui/, page: true, cellMinWidth: 100,totalRow:true,cols: [[ //表头//{ type: checkbox },{ type: checkbox,totalRowText: "合计" },//合计行区域{ field: id, align: center,…

改进YOLO系列 | YOLOv5/v7 引入Super Token Sampling ViT | 《CVPR 2023 最新论文》

论文地址:https://arxiv.org/abs/2211.11167 代码地址:https://github.com/hhb072/STViT 视觉变换器已经在许多视觉任务中取得了令人印象深刻的性能。然而,它在捕捉浅层的局部特征时可能会受到高度冗余的影响。因此,引入了局部自注意力或早期卷积,这些方法牺牲了捕捉长距…

js案例:打地鼠游戏(打灰太狼)

效果预览图 游戏规则 当灰太狼出现的时候鼠标左键点击灰太狼加10分&#xff0c;小灰灰出现的时候鼠标左键点小灰灰击减10分&#xff0c;不点击不减分不加分。 整体思路 1.把获取背景图片中每个地洞的位置&#xff0c;把所有位置放到一个数组中。 2.封装随机数函数&#xff0c;随…

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。 概述 时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。 用法 CnosDB 将使用一种全新的…

【ATTCK】MITRE Caldera - 测试数据泄露技巧

CALDERA是一个由python语言编写的红蓝对抗工具&#xff08;攻击模拟工具&#xff09;。它是MITRE公司发起的一个研究项目&#xff0c;该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的&#xff0c;能够较真实地APT攻击行为模式。 通过CALDERA工具&#xff0c;安全…

几种解决mfc140.dll文件缺失的方法,电脑提示mfc140.dll怎么办

电脑提示mfc140.dll缺失&#xff0c;如果你不去处理的话&#xff0c;那么你的程序游戏什么都是启动不了的&#xff0c;如果你想知道有什么方法可以解决那么可以参考这篇文章进行解决&#xff0c;今天给大家几种解决mfc140.dll文件缺失的方法。电脑提示mfc140.dll也不用担心解决…

Redis Java 开发简单示例

文章目录 一、概述二、Jedis 开发示例2.1 导入 maven 依赖2.2 使用连接池读写2.3 使用集群读写2.4 完整示例代码2.5 测试集群的搭建 三、Lettuce 开发示例3.1 导入 maven 依赖3.2 读写数据 四、Spring Boot Redis 开发示例4.1 导入 maven 依赖4.2 配置Redis服务地址4.3 基于 Re…

智慧城市数据中台建设方案:PPT全文51页,附下载

关键词&#xff1a;智慧城市解决方案&#xff0c;数据中台解决方案&#xff0c;智慧城市建设&#xff0c;数据中台技术架构&#xff0c;数据中台建设 一、智慧城市数据中台建设背景 智慧城市数据中台是在城市数字化转型和智能化升级的背景下提出的&#xff0c;旨在实现城市数…

WebSocket网络协议

二十六、WebSocket 26.1 介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 HHTP协议和WebSocket协议对比&#xff…

基于LDA主题分析的《老友记》情景喜剧数据集的建模分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

外星人笔记本键盘USB协议逆向

前言 我朋友一台 dell g16 购买时直接安装了linux系统&#xff0c;但是linux上没有官方的键盘控制中心&#xff0c;所以无法控制键盘灯光&#xff0c;于是我就想着能不能逆向一下键盘的协议&#xff0c;然后自己写一个控制键盘灯光的程序。我自己的外星人笔记本是m16&#xff…

Django(三、数据的增删改查、Django生命周期流程图)

文章目录 一、 基于ORM进行的CURDuser_list&#xff1a;作为主页使用路由文件urls.py配置如下&#xff1a;add.html&#xff1a;用于新增用户的数据页add页面视图函数如下:edit.html&#xff1a;修改数据的页面那么来总结一下上序所操作所用到的内容。 导入已存在的表其方式有两…

Unity 使用INI文件存储数据或配置参数预设

法1&#xff1a;调用外部Capi库 具体使用&#xff1a; public class Ini{//读取INI文件需要调用C的APP[System.Runtime.InteropServices.DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, st…

Leetcode—20.有效的括号【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—20.有效的括号 C实现代码 class Solution { public:bool isValid(string s) {stack<char> arr;int len s.size();if(len 1) {return false;}for(int i 0; i < len; i) {if(s[i] ( || s[i] [ || s[i] {)…

SSM框架Demo: 简朴博客系统

文章目录 1. 前端页面效果2. 项目创建3. 前期配置3.1. 创建数据库数据表3.2. 配置文件 4. 创建实体类5. 统一处理5.1. 统一返回格式处理5.2. 统一异常处理 6. 全局变量7. Session工具类8. 登录拦截器9. 密码加盐加密10. 线程池组件11. dao层11.1. UserMapper11.2. ArticleMappe…

Linux 基本语句_10_进程

进程和程序的区别&#xff1a; 程序是一段静态的代码&#xff0c;是保存在非易失储存器上的制令和数据的有序集合&#xff0c;没有任何执行的概念&#xff1b;而进程是一个动态的概念&#xff0c;它是程序的一次执行过程&#xff0c;包括了动态创建、调度、执行和消亡的整个过程…

面向切面编程AOP

2023.11.12 本章学习spring另一大核心——AOP。AOP是一种编程技术&#xff0c;底层是使用动态代理来实现的。Spring的AOP使用的动态代理是&#xff1a;JDK动态代理 CGLIB动态代理技术。Spring在这两种动态代理中灵活切换&#xff0c;如果是代理接口&#xff0c;会默认使用JDK动…

KDE Plasma 6 将不支持较旧的桌面小部件

KDE Plasma 6 进行了一些修改&#xff0c;需要小部件作者进行调整。开发人员&#xff0c;移植时间到了&#xff01; KDE Plasma 6 是备受期待的桌面环境版本升级版本。 最近&#xff0c;其发布时间表公布&#xff0c;第一个 Alpha 版本将于 2023 年 11 月 8 日上线&#xff0…