分区和集群是如何在配置单元表中工作的?

enxuqcxy  于 2021-07-13  发布在  Hadoop
关注(0)|答案(1)|浏览(268)

我试图通过使用下面的查询来理解如何放置数据。

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个bucket(文件),所有这些文件都将具有 employee_id 但哪个文件将放在哪个目录下,如何决定?
有人能帮我理解这个吗?

rfbsl7qr

rfbsl7qr1#

目录是分区或表位置。bucket是这些目录中的文件。
复杂分区是分层目录。就你而言:

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

每个文件将不包含所有员工id。哪个记录将位于哪个文件中使用以下公式确定:

bucket_number=hash_function(employee_id) MOD 256

哪里 hash_function 是整数,如果是int employee_id 等于员工id。 256 -是桶的数量 MOD 256 将产生[0..255]范围内的整数值,对应于桶编号。
同一个id总是在同一个bucket中。每个每日分区将包含它自己的文件(bucket),每个分区最多包含256个bucket。
假设employee\u id=1024进入bucket 0,如果同一个employee\u id在很多天内都存在,那么它将在每个day目录的00000文件中。 employee_id=1050 进入文件000026,因为 1050 MOD 256 = 26 .
因此,首先数据是按分区键进行分区的,在分区内它是扣接的(分布在文件之间)。

相关问题