Hive分桶、Hive JDBC

Hive笔记3:Hive分桶、Hive JDBC

一、Hive分桶

分桶实际上是对文件(数据)的进一步切分

Hive默认关闭分桶

作用:在往分桶表中插入数据的时候,会根据 clustered by 指定的字段 进行hash分区 对指定的buckets个数 进行取余,进而可以将数据分割成buckets个数个文件,以达到数据均匀分布,可以解决Map端的“数据倾斜”问题,方便我们取抽样数据,提高Map join效率

分桶字段 需要根据业务进行设定

1、开启分桶开关
hive> set hive.enforce.bucketing=true;
2、建立分桶表
create table students_buks
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
CLUSTERED BY (clazz) into 12 BUCKETS	#指定分桶的字段,并指定分桶的数量
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 
3、往分桶表中插入数据
// 直接使用load data 并不能将数据打散,结果和插入普通表一样
load data local inpath '/usr/local/soft/data/students.txt' into table students_buks;

// 需要使用下面这种方式插入数据,才能使分桶表真正发挥作用
insert into students_buks select * from students;

https://zhuanlan.zhihu.com/p/93728864 Hive分桶表的使用场景以及优缺点分析

注意:
(1)一个数据文件假如指定了12个分桶数量-->会生成12个Reduce分区-->12个MR任务-->12个文件;
(2)按照班级分桶,那么班级相同的会分在同一个桶里
(3)注意区分Reduce分区和Hive分区,两者概念不同
(4)分区:生成子目录
	分桶:切分单个数据文件生成多个数据文件目录

二、Hive JDBC

1、启动hiveserver2
[root@master ~]# service hiveserver2 &
或者
[root@master ~]# hiveserver2 &

&表示将hiveserver2后台运行,一般不使用&

如果运行了多台hiveserver2 &,会使IDEA连接冲突,使用 kill -9 进程号 来删除运行
2、新建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>
3、编写JDBC代码
package com.shujia.HiveJDBC;

import java.sql.*;

public class HiveJDBCOp {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1、加载驱动
        Class.forName("org.apache.hive.jdbc.HiveDriver");

        // 2、创建连接
        Connection conn = DriverManager.getConnection("jdbc:hive2://master:10000/test1","root","");

        // 3、创建Statement
//        Statement st = conn.createStatement();
        // 4、执行SQL语句 select * from students limit 10
//        ResultSet rs = st.executeQuery("select * from students limit 10");
        
        // 3、使用prepareStatement 防止SQL注入的问题(推荐使用)
        PreparedStatement pSt = conn.prepareStatement("select * from students where clazz=?");
		//设置参数
        pSt.setString(1, "文科一班");

		 // 4、执行SQL语句
        ResultSet rs = pSt.executeQuery();

        // 5、遍历ResultSet获取数据
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String gender = rs.getString("gender");
            String clazz = rs.getString("clazz");

 System.out.println(id + "," + name + "," + age + "," + gender + "," + clazz);
        }

        // 关闭连接
        rs.close();
        pSt.close();
        conn.close();
    }
}
posted @   阿伟宝座  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示