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

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

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

  1. CREATE TABLE mytable (
  2. name string,
  3. city string,
  4. employee_id int )
  5. PARTITIONED BY (year STRING, month STRING, day STRING)
  6. CLUSTERED BY (employee_id) INTO 256 BUCKETS

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

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

但我不明白,怎么办 employee_id 将分布在这些目录中?将创建256个bucket(文件),所有这些文件都将具有 employee_id 但哪个文件将放在哪个目录下,如何决定?
有人能帮我理解这个吗?

rfbsl7qr

rfbsl7qr1#

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

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

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

  1. 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 .
因此,首先数据是按分区键进行分区的,在分区内它是扣接的(分布在文件之间)。

展开查看全部

相关问题