我正试图通过使用数据的放置方式来理解下面的查询。
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
,但哪个文件将位于哪个目录下,如何决定?
有人能帮我理解吗?
目录是分区或表位置。Buckets是这些目录中的文件。
复杂分区是分层目录。在您的情况下:
`/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
是整数,在Intemployee_id
的情况下,它等于employee_id。
256
-是的桶数
MOD 256
将产生[0.255]范围内的整数值,对应于存储桶编号。
相同的id将总是在相同的桶中。每个日常分区将包含自己的文件(bucket(,每个分区最多256个bucket。
假设employee_id=1024进入bucket 0,如果在许多天内存在相同的employee_id,则它将在每天目录中的文件00000中。
CCD_ 8进入文件000026,因为CCD_。
因此,首先通过分区键对数据进行分区,在分区内对数据进行分块(分布在文件之间(。