Day2-Hive的多字段分区,分桶和数据类型

2024-04-05 03:04

本文主要是介绍Day2-Hive的多字段分区,分桶和数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hive

表结构

分区表

  1. 多字段分区:需要使用多个字段来进行分区,那么此时字段之间会构成多层目录,前一个字段形成的目录会包含后一个字段形成的目录,从而形成多级分类的效果。例如商品的大类-小类-子类, 省市县、年级班级等

  2. 案例

    1. 原始数据

      1 1 bob
      1 1 amy
      1 1 alex
      1 2 david
      1 2 cindy
      1 2 bruce
      1 3 balley
      1 3 danniel
      1 3 grace
      2 1 henry
      2 1 hack
      2 1 grace
      2 2 jack
      2 2 john
      2 2 lucy
      
    2. 多字段分区

      -- 建立临时表
      create table students_tmp (grade int,class int,name  string
      ) row format delimited fields terminated by ' ';
      -- 加载数据
      load data local inpath '/opt/hive_data/students' into table students_tmp;
      -- 建立分区表
      create table students (name string
      ) partitioned by (grade int, class int);
      -- 开启动态分区
      set hive.exec.dynamic.partition.mode = nonstrict;
      -- 动态分区
      insert into students partition (grade, class)
      select name, grade, class
      from students_tmp distribute by grade, class;
      -- 查看数据
      select * from students tablesample (5 rows);
      

分桶表

  1. 当数据量比较大,但是又需要对数据进行大致的、快速的分析的时候,此时可以考虑对数据进行抽样处理。但是抽样的字段和要分析的字段之间不能有关联

  2. 在Hive中,抽样方式非常多,其中一种方式就是对数据进行分桶:先计算分桶字段的哈希值,然后对桶的个数取余数,根据余数来决定将数据放入哪一个桶中

  3. 注意:在Hive3.1.3之前的版本中,分桶表不支持load方式,只能是使用insert方式来插入数据来进行分桶;从Hive3.1.3开始,支持load方式,但是load方式效率非常低而且可能会不分桶

  4. 案例

    -- 在Hive中,分桶机制默认是不开启的,所以需要先开启分桶机制
    set hive.enforce.bucketing = true;
    select *
    from heros;
    -- 建立分桶表
    -- 分了n个桶,就会产生n个ReduceTask,从而会产生n个结果文件
    -- 所以桶数越多,产生ReduceTask越多,占用集群的资源就越多
    create table hero_buckets (id      int,name    string,country string
    ) clustered by (name) into 4 bucketsrow format delimited fields terminated by ' ';
    -- 向分桶表中插入数据
    -- 根据name字段的值来分桶,在计算的时候,是先计算name字段的哈希码,对桶数取余,余数是几,就放入哪个桶
    insert overwrite table hero_buckets
    select id, name, country
    from heros;
    -- 从分桶表中来获取数据
    -- bucket x out of y
    -- 在Hive3.x中,x表示从第一个桶的第几条数据开始获取,y表示每几条数据来获取一次
    -- bucket 1 out of 2表示从第一条数据开始获取,每2条获取一次 --- 获取的是1,3,5...
    -- y必须是桶数的倍数或者因子
    select *
    from hero_buckets tablesample (bucket 1 out of 2 on name);
    

数据类型

概述

  1. Hive提供非常多的数据类型,分为两类:基本类型和复杂类型

  2. 基本类型

    Hive类型Java类型
    tinyintbyte
    smallintshort
    intint
    bigintlong
    floatfloat
    doubledouble
    booleanboolean
    stringString
    binarybyte[]
    timestampTimestamp
  3. 复杂类型主要有三个:arraymapstruct

array类型

  1. array:数组,对应了Java中的数组或者集合

  2. 案例

    1. 原始数据

      1 amy,bob tom,simon,peter
      2 lucy,lily,jack thomas,tony
      3 perl,john alex,adair,dell
      4 hack,henry vincent,william,vivian
      
    2. 案例

      -- 建表
      create table battles (battle_id int,group_a   array<string>,group_b   array<string>
      ) row format delimitedfields terminated by ' ' -- 字段之间使用空格隔开collection items terminated by ','; -- 数组元组之间用逗号隔开
      -- 加载数据
      load data local inpath '/opt/hive_data/battles' into table battles;
      -- 查询数据
      select *
      from battles;
      -- 查询a组成员
      select group_a from battles;
      -- 获取a组第一个成员
      select group_a[0] from battles;
      -- 获取a组第一个成员
      select group_a[2] from battles where group_a[2] is not null;
      

map类型

  1. map:映射,对应了Java中的映射

  2. 案例

    1. 原始数据

      1 amy,19 lucy,18
      2 david,18 alex,19
      3 henry,18 hack,18
      
    2. 案例

      -- 建表
      create table members (id    int,mem_a map<string,int>,mem_b map<string,int>
      ) row format delimitedfields terminated by ' 'map keys terminated by ',';
      -- 加载数据
      load data local inpath '/opt/hive_data/members' into table members;
      -- 查询数据
      select * from members;
      -- 查询成员b的信息
      select mem_b from members;
      -- 查询hack的信息
      select mem_b['hack'] from members where mem_b['hack'] is not null;
      

这篇关于Day2-Hive的多字段分区,分桶和数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877487

相关文章

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

Redis地理数据类型GEO

通常要计算两个地理位置的距离不是很方便,这里可以直接通过Redis提供的GEO操作来完成地理位置相关的计算 1)添加地理位置 语法:geoadd key longitude latitude member [longitude latitude member] ...字段说明:key:存放地理位置的集合名称longitude:地理坐标的经度latitude:地理坐标的纬度member:表示这