首页 > 其他分享 >数据仓库建模工具之一——Hive学习第六天

数据仓库建模工具之一——Hive学习第六天

时间:2024-07-24 22:57:20浏览次数:19  
标签:分桶 分区 数据仓库 hive 字段名 第六天 Hive 排序 select

2、Hive分桶(接着前面hive分区开始学习)

2.1 业务场景

数据分桶的适用场景:
分区提供了一个隔离数据和优化查询的便利方式,不过并非所有的数据都可形成合理的分区,尤其是需要确定合适大小的分区划分方式
不合理的数据分区划分方式可能导致有的分区数据过多,而某些分区没有什么数据的尴尬情况
分桶是将数据集分解为更容易管理的若干部分的另一种技术。
分桶就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去。(都各不相同)

2.2 数据分桶原理

  • Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
    • bucket num = hash_function(bucketing_column) mod num_buckets ( hash(name)%n == x )
    • 列的值做哈希取余 决定数据应该存储到哪个桶

2.3 数据分桶优势

方便抽样

​ 使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便

提高join查询效率

​ 获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

2.4 分桶实战

​ 首先,分区和分桶是两个不同的概念,很多资料上说需要先分区在分桶,其实不然,分区是对数据进行划分,而分桶是对文件进行划分。

​ 当我们的分区之后,最后的文件还是很大怎么办,就引入了分桶的概念。

将这个比较大的文件再分成若干个小文件进行存储,我们再去查询的时候,在这个小范围的文件中查询就会快很多。

​ 对于hive中的每一张表、分区都可以进一步的进行分桶。

​ 当然,分桶不是说将文件随机进行切分存储,而是有规律的进行存储。它是由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。

创建顺序和分区一样,创建的方式不一样。

# 分区和分桶的区别
1、在HDFS上的效果区别,分区产生的是一个一个子文件夹,注意:分区虽然产生了很多子文件夹,但是这些文件夹所属的那个文件其实映射到hive中就是一张表。而分桶产生的是一个一个文件,但其实在hive上也是一个分桶表

2、无论是分区还是分桶,在建表的时候都要指定字段,分区使用partitioned by指定分区字段,分桶使用clustered by指定分桶字段

3、partitioned by指定分区字段的时候,字段后面需要加上类型,而且不能在建表小括号中出现。clustered by指定分桶字段的时候,字段已经出现定义过了,只需要指定字段的名字即可

4、分区字段最好选择固定类别的,分桶字段最好选择值各不相同的。

5、分桶不是必须要建立在分区之上,可以不进行分区直接分桶

首先我们需要开启分桶的支持

(依然十分重要,不然无法进行分桶操作!!!!)
set hive.enforce.bucketing=true; 

数据准备(id,name,age)

1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88

创建一个普通的表

create table person
(
id int,
name string,
age int
)
row format delimited
fields terminated by ',';

将数据load到这张表中

load data local inpath '文件在Linux上的绝对路径' into table psn31;

创建分桶表

同时指定桶的个数

create table psn_bucket
(
id int,
name string,
age int
)
clustered by(age) into 4 buckets
row format delimited fields terminated by ',';

将数据insert到表psn_bucket中

(注意:这里和分区表插入数据有所区别,分区表需要select 和指定分区,而分桶则不需要)

insert into psn_bucket select * from person;

查询数据

我们在linux中使用Hadoop的命令查看一下(与我们猜想的顺序一致)

hadoop fs -cat /user/hive/warehouse/bigdata17.db/psn_bucket/*

这里设置的桶的个数是4 数据按照 年龄%4 进行放桶(文件)
11%4 == 3 -----> 000003_0
22%4 == 2 -----> 000002_0
33%4 == 1 -----> 000001_0
44%4 == 0 -----> 000000_0
...以此类推

3、Hive JDBC

启动hiveserver2
nohup hiveserver2 &
或者
hiveserver2 &
新建maven项目并添加两个依赖
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>1.2.1</version>
    </dependency>
编写JDBC代码
import java.sql.*;

public class HiveJDBC {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        Connection conn = DriverManager.getConnection("jdbc:hive2://master:10000/hive_test");
        Statement stat = conn.createStatement();
        ResultSet rs = stat.executeQuery("select * from students limit 10");
        while (rs.next()) {
            int id = rs.getInt(1);
            String name = rs.getString(2);
            int age = rs.getInt(3);
            String gender = rs.getString(4);
            String clazz = rs.getString(5);
            System.out.println(id + "," + name + "," + age + "," + gender + "," + clazz);
        }
        rs.close();
        stat.close();
        conn.close();
    }
}

4、Hive查询语法(DQL)

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT [offset,] rows]

4.1 全局排序

  • order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间
  • 使用 order by子句排序 :ASC(ascend)升序(默认)| DESC(descend)降序
  • order by放在select语句的结尾
  • order by 无论之前设置的reduce个数是多少个,都只会产生一个reduce进行任务的处理
select * from 表名 order by 字段名1[,别名2...];

4.2 局部排序(对reduce内部做排序)

  • sort by 不是全局排序,其在数据进入reducer前完成排序
  • 如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by 只保证每个reducer的输出有序,不保证全局有序。asc,desc
  • 设置reduce个数
set mapreduce.job.reduces=3;
  • 查看reduce个数
set mapreduce.job.reduces;
  • 排序
select * from 表名 sort by 字段名[,字段名...];

4.3 分区排序(本身没有排序)

distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。

类似MR中partition,进行分区,结合sort by使用。(注意:distribute by 要在sort by之前)

对于distrbute by 进行测试,一定要多分配reduce进行处理,否则无法看到distribute by的效果。

设置reduce个数

set mapreduce.job.reduce=7;
  • 排序
select * from 表名 distribute by 字段名[,字段名...] sort by 字段;

4.3 分区并排序

  • cluster by(字段)具有Distribute by的功能外
  • cluster by = distribute by + sort by 只能默认升序,不能使用倒序
  • 当reduce个数设置成一个时,cluster by就相当于是order by进行全局排序
select * from 表名 cluster by 字段名[,字段名...];
select * from 表名 distribute by 字段名[,字段名...] sort by 字段名[,字段名...];

标签:分桶,分区,数据仓库,hive,字段名,第六天,Hive,排序,select
From: https://www.cnblogs.com/shmil/p/18321939

相关文章

  • Hive SQL的坑和note
    Hive的GROUPBY是不能识别别名的:把别名对应的那个表达式都扔到groupby里去非聚合列必须出现在groupby中selectcol1,col2,collect_set(col3)sum(is_drawback)asorder_cntcount(1)asxxxFROMxxx.tablegroupbycol1,col2insertinto与insertoverwrite都......
  • php使用ZipArchive解压压缩包
    //处理照片压缩包$zip=new\ZipArchive();//获取压缩包内容照片数量$path='static/oa/img/staImport/'.date('Ymd').'/'.date('His');if($zip->open($param['fileUrl'])===TRU......
  • 数据仓库中的数据治理
    一、数据治理的定义:数据治理是一套用于管理和保护数据资源的规范、流程和控制机制。在数据仓库中,数据治理涉及规划、定义、监控和维护数据的标准、策略和流程,以确保数据的质量、完整性和一致性。二、数据治理的流程:制定数据治理策略:明确数据治理的目标、范围和原则,并制定数......
  • 计算机毕业设计hadoop++hive微博舆情预测 微博舆情分析 微博推荐系统 微博预警系统 微
    本科毕业论文论文题目:基于Hadoop的热点舆情数据分析与可视化                                                      姓名:      金泓羽       学号:   20200804050115   ......
  • 学习笔记第六天
    1.循环结构概述 定义:在给定条件成立时,反复执行某程序段; 要素:循环变量初始化语句;            循环的执行条件;      有使循环趋于结束的语句;2.while循环 格式:while(表达式)语句;特点:先判断条件,后执行语句3.do-while循环格式:do语句whi......
  • 一周学完Java基础,第六天,常见容器
    (1)列表List         接口:    java.util.List<>    实现方式:    java.util.ArrayList<>:变长数组    java.util.LinkedList<>:双链表    函数:    add():在末尾添加一个元素    clear():......
  • 7.20解决hive无法删除和修改的问题
    参考文献:hiveupdate和delete报错Attempttodoupdateordeleteusingtransactionmanager-CSDN博客 首先说明,hive数据库一般是增和查询用得比较多,不建议频繁的去修改删除,有悖hive数据库的初衷。废话不多说,开始配置,首先找到你的hive-site.xml的路径 一般来说是在hive的......
  • 苦学Opencv的第六天:图像的几何变换
    PythonOpenCV入门到精通学习日记:图像的几何变换前言几何变换,顾名思义就是修改图像的几何结构,例如大小,角度和形状等等,让图像呈现不同的效果。这些几何变换的操作一般都涉及复杂且精密的计算,Opencv将这些计算过程全部都包装成了各种灵活的方法,我们只需要修改一些参数,就能实......
  • 数据仓库建模工具之一——Hive学习第五天
    Hive的分区1、Hive分区(十分重要!!)分区的目的:避免全表扫描,加快查询速度!在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者......
  • 学习Java的第六天(2024.7.19)
    1.容器类、集合类之前学过的容器:数组,但是数组有局限:1.数组存储的数据类型有限制2.数组存储的长度受限2.容器类分为:List,Set,Map3.List类:List是一个接口,他的实现类有:ArrayList,LinkedList,Vectorpublicstaticvoidmain(String[]args){Listlist=newArrayLi......