分组表,分桶表

news2024/11/18 8:14:21

1,启动Hive服务

(1)启动HiveServer2服务

nohup hive --service metastore &

(2)启动Metastore服务

nohup hive --service hiveserver2 &

(3)查看进程信息

lsof -i:10000

2,分区表概述

定义:在大数据开发中,若要加载与显示一个超大数据规模的文件,为了提升获取数据的效率,通常也可以切割成一个个小文件夹存放。这种过程,可以称为分区
使用场景:地域,省市区,年月日等这些分级的更适合通过分区表划分

2.1单分区表,多分区表

(1)以对存有海量数据的student表为例,仅以月份字段来分区时,表示单分区表。

(2)示例·:再以对存有海量数据的student表为例,当以年份、月份、日期等多个字段来分区时,表示多分区表。(三级分区)
内部表、外部表是同一级别的数据表,而它们都可以有分区表、分桶表。
通俗地说,表分区其实就是HDFS上的不同文件夹,采用此方式可以极大的提高特定场景下Hive的操作性能

2.2创建分区表

create [external] table 表名(
字段名 字段类型 [comment '注释'],
字段名 字段类型 [comment '注释'],
...
)
[partition by(分区列 数据类型, ...)]
[row format delimited
fields terminated by '指定分隔符'];

1,说明:
(1)partition表示给数据表分区处理,但后面字段有多个时,表示多分区表;
(2)分区列名不允许与表字段同名,要单独命名,一般以年、月、日分区;
(3)注意:partition的位置要放在设定分隔字符语句之前。

-- 创建分区表: 年
create table tb_score(
name string,
subject string,
number double
)
partitioned by (year string)
row format delimited
fields terminated by "\t";

插入数据

insert into tb_score partition (year="2014") values ("张三","男",59.9);

3,使用分区表

3.1查看分区表

(1)在HDFS页面中查看
进入HDFS页面后,我们可以看到一个个的分区是以文件夹的形式显示。
(2)desc查看表字段信息
可以使用desc命令查看表相关信息,语法

-- 查看基本信息
desc 表名;
-- 以序列化形式查看更多信息
desc extended 表名;
-- 以表格形式查看所有信息
desc formatted 表名;

(3)显示有哪些分区表
当给表设定了多个分区后,可以查看到有哪些分区,命令:

show partitions 表名;

use sz41db_part;
show tables ;
desc tb_score;
desc extended tb_score;
desc formatted tb_score;
show partitions tb_score;
show partitions tb_score; -- 如何解决?

实际上,给表建立分区,就是以分区列来创建对应名称的子文件夹。

3.2加载数据

当要给分区表添加数据时,通常做法有:

-- 从本地Linux系统中导入数据到表中
load data local inpath 'linux本地文件路径名' into table 表名;
-- 从HDFS中导入数据到表中
load data inpath 'hdfs文件路径名' [overwrite] into table 表名;

3.3修改表

对于分区列的值,可以使用alter关键字进行修改,修改操作有:
(1)添加分区
当要给数据表新增一个分区时,可以使用add关键字,语法:

alter table 表名 add partition(分区字段='分区值');

(2)删除分区
删除一个失效分区时,需要用到drop关键字,语法:

alter table 表名 drop partition(分区字段='分区值');

(3)修改分区值
可以使用rename to关键字来修改分区列所对应的值,语法:

alter table 表名 partition(分区字段='旧分区值') rename to partition(分区字段='新分区值');

示例代码:

use sz41db_part;
show tables ;
show partitions tb_score;
alter table tb_score add partition (year="4444");
alter table tb_score add partition (year="5000");
alter table tb_score drop partition (year="4444");
alter table tb_score drop partition
(year="__HIVE_DEFAULT_PARTITION__");
alter table tb_score partition (year="5000") rename to
partition (year="6666");

若要修改分区表信息时,一般需要借助alter关键字。

3.3.1修复分区表

当我们手动在HDFS页面中创建分区目录,甚至给分区目录下导入结构化数据后,发现使用:仍然无法查询出数据结果,这是为什么呢?
没有在HDFS中刷新出分区数据信息,导致无法识别。
而实际上,这个操作称为修复分区表

msck repair table 表名;

4,多分区表案例

当对数据表进行多级分区处理时,常以年、月、日形式来划分数据。

create table part_product(
pid int,
pname string,
price double,
number int
)
partitioned by (year string, month string, day string)
row format delimited
fields terminated by ";";

插入数据:

-- 上传数据到linux中, 加载到表中
load data local inpath
"/root/day08_hive/more_part/order20230415.txt" into table part_product partition (year="2023",month="4",day="15");

建议给表设定分区列的类型设定为字符串,方便后期操作;

5.分桶表的使用

定义:分桶表也叫做桶表,源自建表语法中【bucket】单词,是一种用于优化查询而设计的表类型。
该功能可以让数据分解为若干个部分,且易于管理的文件。
通俗地说,对表进行分桶处理,和分区类似,也是一种通过改变表的存储模式,从而完成对表优化的一种调优方式。
但和分区不同,分区是将表拆分到不同的子文件夹中进行存储,而分桶是将表拆分到固定数量的不同文件中进行存储。
原理:在分桶时,我们要指定根据哪个字段来将数据分为几桶(即几个部分),而桶编号相同的数据会被分到同一个桶当中。

分桶默认规则是:

Bucket number = hash_function(bucketing_column) mod num_buckets
# hash_function() 函数名
# bucketing_column 值类型

:hash_function函数的返回值,取决于分桶字段bucketing_column的类型。

1)如果是int类型,hash_function(int) == int;
(2)如果是其他类型,比如string或复杂数据类型,hash_function比较棘手,将是从该类型生成的某个数字,比如hashcode值。
# 可以通过select hash("值") 查看哈希码

5.1 创建与使用分桶表

create [external] table 表名(
字段名 字段类型 [comment '注释'],
字段名 字段类型 [comment '注释'],
...
)
[partition by(分区列 数据类型, ...)]
[clustered by (字段名) into 分桶数 buckets]
[row format delimited
fields terminated by '指定分隔符'];

说明:
(1)clustered表示给数据表分桶处理,且后面的[into 分桶数 buckets]的数字,表示桶数为多少;[下面说明]
(2)需要注意的是,分桶的字段必须是表中已经存在的字段名;
(3)若分区、分桶同时存在,且分区语句在前,分桶在后;
(4)注意:clustered的位置要放在partition字符语句之后。
示例代码:

create table bucket_id_course(
id int,
subject string,
name string
)
clustered by (id) into 3 buckets
row format delimited
fields terminated by "\t";

desc formatted bucket_id_course;
load data local inpath "/root/day08_hive/bucket/course01.txt"
into table bucket_id_course;

特别注意,分桶列必须是表内已有的字段名,可以是数值型、也可以是字符串型。

5.3hash建模

创建分桶表语法:

create [external] table 表名(
字段名 字段类型 [comment '注释'],
字段名 字段类型 [comment '注释'],
...
)
[clustered by (字段名) into 分桶数 buckets]
...

上述格式中[分桶数]代表分桶的数量。而如果没有额外修改reduce数量时,默认分桶数和reduce值一致。
分桶的原理:首先,对分桶字段值进行Hash算法加密,然后对分桶数量进行取模,生成对应分桶文件。
了解:Hash算法是一种数据加密算法,其原理我们不去详细讨论,我们只需要知道其主要特征:

同样的值被Hash算法加密后的结果,是一致的!
比如,"heima"哈希值是99159456, 无论hash3取模多少次,结果都是0# 可以通过select hash("值") 查看哈希码

基于如上特征,在辅以有3个分桶文件的基础上,将Hash的结果基于3取模(即除以
3取余数)。结果:

一个字符串或无论什么数据,得到的取模结果均是:012,其中一个。

5.4分桶表的优势

1,和非分桶表相比,使用分桶表能带来性能提升。优势有:
(1)提升过滤性能
基于分桶字段的where过滤查询时,可减少全表扫描:

select * from course where id=xxx;

(2)提升join多表查询
JOIN时可以提高MapReduce程序效率,减少笛卡尔积数量。
对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行JOIN操作就可以,这样能大大较少JOIN的数据量
(3)提升分组效率
以某列作为分组时,可减少全表扫描,进入到分桶表中处理,效率高一些
(4)提升抽样处理
当对分桶表数据进行抽样可减少数据的抽样处理
当数据量特别大时,对全体数据进行处理存在困难,抽样就显得尤其重要了。
抽样可以从被抽取的数据中,估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。
使用分桶表对海量数据内容作文件拆分后,一般能对过滤带来不少性能提升;
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

hologres 索引与查询优化

hologres 优化部分 1 hologres 建表优化1.1 建表中的配置优化1.1 字典索引 dictionary_encoding_columns1.2 位图索引 bitmap_columns1.2.2 Bitmap和Clustering Key的区别 1.3 聚簇索引Clustering Key 1 hologres 建表优化 1.1 建表中的配置优化 根据 holo的 存储引擎部分的知…

公共字段自动填充-@TableField的fill实现(2)

TheadLocal 客户端发送的每次http请求,在服务端都会分配新的线程。因此登录检查过滤器、controller、元数据对象处理器属于一个线程。 TheadLocal是线程的局部变量: TheadLocal常用方法: 如何在元数据对象处理器中获取当前登录用户的id&…

力扣hot100 两数之和 哈希表

&#x1f468;‍&#x1f3eb; 力扣 两数之和 &#x1f60b; 思路 在一个数组中如何快速找到某一个数的互补数&#xff1a;哈希表 O(1)实现⭐ AC code class Solution {public int[] twoSum(int[] nums, int target){HashMap<Integer, Integer> map new HashMap<&g…

shell脚本学习笔记07

如何让shell实现 可选择性执行 的功能 用了while进行循环&#xff0c;是死循环&#xff0c;在循环时&#xff0c;使用case进行使用哪个脚本进行执行。使用clear进行每一次操作前的清屏&#xff0c;eof代表输入这个会显示目录。read用来读取输入的值&#xff0c;如果不输入值不会…

初始ProtoBuf

目录​​​​​​​ ⼀、初识ProtoBuf 1. 序列化概念 2. ProtoBuf是什么 3. ProtoBuf的使用特点 ⼆、安装ProtoBuf 1、ProtoBuf在window下的安装 2、ProtoBuf在Linux下的安装 ⼀、初识ProtoBuf 1. 序列化概念 序列化和反序列化 序列化&#xff1a;把对象转换为字节序列…

【开源】基于Vue.js的高校实验室管理系统的设计和实现

项目编号&#xff1a; S 015 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S015&#xff0c;文末获取源码。} 项目编号&#xff1a;S015&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

LeetCode【12】整数转罗马数字

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/m0_71120708/article/details/128769894 代码&#xff1a; public String intToRoman(int num) {String[] thousands new String[] {"", "M", "MM", "MMM"};String[] hun…

【C++历练之路】list的重要接口||底层逻辑的三个封装以及模拟实现

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 在C的世界中&#xff0c;有一种数据结构&#xff0c;它不仅像一个神奇的瑰宝匣&#xff0c;还像一位能够在数据的海洋中航行的智慧舵手。这就是C中的list&#xff0c;一个引人入胜的工具…

千梦网创:外貌与内貌

一、怎样提高身价&#xff1f; 同样的商品或服务怎样卖得更贵&#xff1f; 要么通过更贵的渠道、要么通过更好的包装。 水还是那个水&#xff0c;放在星巴克可以卖很贵&#xff0c;印上不同的logo可以卖不同的价格。 拿线下的教育培训行业来说&#xff0c;真正让你去测评哪…

保险保险保险保险保险QAQ

该买保险啦&#xff01; 一、百万医疗险&#xff1a;事后报销医疗费用1、蓝医保 太平洋保险2、长相安 平安健康3、金医保 人寿保险4、好医保 人保健康 二、重疾险&#xff1a;确诊后一次性给付1、达尔文7号 国联人寿保险公司2、超级玛丽9号 君龙人寿3、守卫者6号 国联人寿保险公…

Sql Server 2017主从配置之:发布订阅

使用发布订阅模式搭建Sql Server 2017主从同步&#xff0c;类似事件通知机制&#xff0c;基本可以做到准实时同步&#xff0c;可以同时做到一对多的数据同步。 不过发布订阅模式&#xff0c;只能同时数据&#xff0c;不能同步表结构。在创建发布的时候&#xff0c;需要选择需要…

SpringBoot 整合 JdbcTemplate

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

ARM CoreLink CCN 互连总线介绍

NIC NOC CCI CMN CNN NI cmn-700 nic-700 ni-700 MLGB这都是啥玩意? 后期博文或视频将会更新这一系列。今天先温习一下CNN的概念,这是来自2014年的文章,然后稍微整理总结一番。 以下是正文… 现代主流和优质 ARM 片上系统 (SoC) 产品使用 CoreLink 缓存一致性网络 (CCN) 504…

论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models

Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型&#xff0c;擅长将文本输入转换为数字表示&#xff0c;捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发&#xff0c;从创建高质量的成对&#xff08;pairwi…

Linux(Ubuntu)安装JDK环境

系统环境 Ubuntu20.04 下载JDK压缩包 前往Oracle官网进行后续下载或单击下载JDK压缩包 下拉找到JDK8&#xff0c;在Linux板块下选择适配系统架构的压缩包文件(后缀为tar.gz)&#xff0c;系统架构可通过uname -m命令查看 安装JDK 安装环境通常放在/usr/local下&#xff0c;进入…

PCL 计算一条射线与一个三角形的交点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里我们使用点向式分别表示一个射线与一个三角形,如下图所示: 其中,平面的法向量 N N N可以由三角形两条边的叉乘来计算,点R0到平面的法向距离

PPT基础:合并形状

目录 合并形状功能详解合并形状使用文字转形状图表转形状 合并形状功能详解 形状&#xff1a;并不局限于ppt内给定的图形&#xff0c;也并不全是图形 &#xff08;1&#xff09;所在位置&#xff1a;选中图形后>>>形状格式>>>最左边 &#xff08;2&#x…

Django自动生成docs接口文档

1.创建Django项目 python manage.py startproject django20252.创建子应用 python manage.py startapp api3.安装依赖包 pip install coreapi4.创建urls.py from django.contrib import admin from django.urls import path, include from rest_framework import routers f…

JAVA for 循环训练 Pattern

import java.util.Scanner;public class Pattern {public static void main(String[] args) {int[] arr {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0};Scanner in new Scanner(System.in);System.out.print("请输入n:");int n in.nextInt();in.close();for …

LeetCode27.移除元素(暴力法、快慢指针法)

每日一题&#xff1a;LeetCode27.移除元素 1.问题描述2.解题思路3.代码 1.问题描述 问题描述&#xff1a;给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必…