如何在 Hive table 中进行分区和聚类?
How partitioning and clustered by works in Hive table?
我试图通过使用数据的放置方式来理解下面的查询。
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
会像目录结构一样在下面分配数据。
/user/hive/warehouse/mytable/y=2015/m=12/d=02
但是我无法理解,employee_id
将如何分布在这些目录中?将创建 256 个存储桶(文件),所有这些文件将全部 employee_id
但哪个文件将位于哪个目录下,将如何决定?
谁能帮我理解一下?
目录是分区或 table 位置。桶是这些目录中的文件。
复杂分区是分层目录。在你的情况下:
`/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 进入存储桶 0,如果相同的 employee_id 存在很多天,它将在每天目录的文件 00000 中。
employee_id=1050
进入文件 000026 因为 1050 MOD 256 = 26
.
因此,首先按分区键对数据进行分区,在分区内将其分桶(分布在文件之间)。
我试图通过使用数据的放置方式来理解下面的查询。
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
会像目录结构一样在下面分配数据。
/user/hive/warehouse/mytable/y=2015/m=12/d=02
但是我无法理解,employee_id
将如何分布在这些目录中?将创建 256 个存储桶(文件),所有这些文件将全部 employee_id
但哪个文件将位于哪个目录下,将如何决定?
谁能帮我理解一下?
目录是分区或 table 位置。桶是这些目录中的文件。
复杂分区是分层目录。在你的情况下:
`/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 进入存储桶 0,如果相同的 employee_id 存在很多天,它将在每天目录的文件 00000 中。
employee_id=1050
进入文件 000026 因为 1050 MOD 256 = 26
.
因此,首先按分区键对数据进行分区,在分区内将其分桶(分布在文件之间)。