我正在尝试使用存储桶映射联接来查询我的星型架构。我有一些小维度表和一个大事实表。我会:
- 按事实数据表的 FK 键对事实数据表进行存储桶
- 按其 ID 键划分的存储桶尺寸
但是,如果我尝试在没有任何分区的情况下存储表,则在插入数据(num_files:1)后,我只能在表文件夹中看到1个文件。
CREATE TABLE user_dimension (
id STRING,
...
name STRING)
CLUSTERED BY (id) INTO 24 BUCKETS;
>> OK
INSERT INTO TABLE user_dimension
SELECT id, name
FROM datasource;
>> Table user_dimension stats: [num_partitions: 0, num_files: 1, num_rows: 478, total_size: 36497, raw_data_size: 36019]
对数据进行分桶时,请确保将
hive.enforce.bucketing=true;
在插入数据之前。
(如果您的维度表非常小,您可能只使用常规映射联接,而无需存储桶。当您需要联接 2 个大表时,存储桶是合适的。
即使
没有对 Hive 表进行分区,也可以进行分桶。
CREATE TABLE bucketed_table(
firstname VARCHAR(64),
lastname VARCHAR(64),
address STRING,
city VARCHAR(64),
state VARCHAR(64),
web STRING
)
CLUSTERED BY (state)
SORTED BY (city)
INTO 32 BUCKETS STORED AS SEQUENCEFILE;