1

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

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但哪个文件将位于哪个目录下,这将如何决定?

谁能帮我理解这一点?

4

1 回答 1

2

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

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

`/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.

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

于 2021-04-10T11:55:29.640 回答