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

相关文章

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

BD错误集锦9——查询hive表格时出错:Wrong FS: hdfs://s233/user/../warehouse expected: hdfs://mycluster

集群环境描述:HDFS集群处于HA模式下,同时启动了YARN\JN\KAFKA\ZK。 现象: FAILED: SemanticException Unable to determine if hdfs://s233/user/hive/warehouse/mydb.db/ext_calllogs_in_hbase is encrypted: java.lang.IllegalArgument

BD错误集锦1——[Hive]ERROR StatusLogger No log4j2 configuration file found. Using default configuration:

错误描述:在使用IDEA进行jdbc方式连接到hive数据仓库时,出现以下错误:                ERROR StatusLogger No log4j2 configuration file found. 问题原因:缺少log4j2.xml文件   <?xml version="1.0" encoding="UTF-8"?><Configuration><Appender

spring boot 使用profile来分区配置

很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置 spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在ap

CHKDSK 无法供 RAW 驱动器使用----分区变成RAW格式

方法一: 花了一天时间后终于找到可恢复文件的工具: 用DiskGenius恢复分区及文件的方法 http://www.diskgenius.cn/function/recovery.asp 方法一对应vsdn

Hive笔记-2

第 3 章 DDL (Data Definition Language) 数据定义 DDL数据定义语言 DML数据操作语言 3.1 数据库 (database) 3.1.1 创建数据库 1) 语法 CREATE DATABASE [IF NOT EXISTS] database_name[COMMENT database_comment][LOCATION hdfs_pat

JS六大数据类型

js的六大数据类型

使用不同数据类型实例化Stack泛型类的代码

package 泛型;import java.math.BigDecimal;import java.math.MathContext;public class StackDemoApp {public static void main(String[] args) {//长类型栈System.out.println("创建'Long'类型栈");//创建用于保存Long数据类型的Stack对象