【问题标题】:How partitioning and clustered by works in Hive table?Hive 表中的分区和集群方式如何工作?
【发布时间】:2021-07-06 01:17:54
【问题描述】:

我试图通过使用数据的放置方式来理解以下查询。

CREATE TABLE mytable ( 
         name string,
         city string,
         employee_id int ) 
PARTITIONED BY (year STRING, month STRING, day STRING) 
CLUSTERED BY (employee_id) INTO 256 BUCKETS

关键字PARTITIONED BY会像dir结构一样将数据分布在下面。

/user/hive/warehouse/mytable/y=2015/m=12/d=02

但我无法理解,employee_id 将如何分布在这些目录中?将创建 256 个存储桶(文件),所有这些文件都将拥有 employee_id,但哪个文件将位于哪个目录下,这将如何决定?

谁能帮我理解这个?

【问题讨论】:

    标签: hadoop hive hadoop-partitioning hive-partitions hiveddl


    【解决方案1】:

    目录是分区或表位置。存储桶是这些目录中的文件。

    复杂分区是分层目录。在你的情况下:

    `/user/hive/warehouse/mytable/` - Table location, contains partition directories:
      `y=2015/` - year partition directory, contains months directories: 
        `m=12/` - month partition, contains days partitions directories:
          `d=02/` - day partition, contains 256 files(buckets)
            00000
            ...
            00255
         `d=03/` -Each day partition will contain 256 files (if you have enough data)
            00000
            ...
            00255     
    

    每个文件都不会包含所有的employee_id。使用以下公式确定哪个记录将位于哪个文件中:

     bucket_number=hash_function(employee_id) MOD 256 
    

    其中hash_function 是整数,如果是Int employee_id 它等于employee_id。

    256 - 是桶数

    MOD 256 将产生 [0..255] 范围内的整数值,对应于存储桶编号。

    相同的 id 将始终位于相同的存储桶中。每个每日分区将包含它自己的文件(桶),每个分区最多 256 个桶。

    假设employee_id = 1024进入bucket 0,如果相同的employee_id存在多天,就会在每天目录的00000文件中。

    employee_id=1050 进入文件 000026,因为1050 MOD 256 = 26

    因此,首先数据按分区键进行分区,在分区内它被分桶(分布在文件之间)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多