这里我给你一些在桶表中创建和插入的技巧。
Bucketing是一种提高Hive查询性能的方法。
分桶将数据存储在单独的文件中,而不是像分区那样单独的子目录。
它以有效的随机方式划分数据,而不是像分区那样以可预测的方式划分数据。
当记录插入分桶表时,Hive 计算指定分桶列中值的哈希码,并使用这些哈希码将记录划分为桶。
因此,bucketing有时也称为hash partitioning。
bucketing 的目标是在预定义数量的 bucket 中平均分配记录。
分桶如果所有连接的表都在连接键列上进行分桶,则可以提高连接的性能。
有关分桶的更多信息,请参阅描述分桶表的Hive 语言手册页面,地址为BucketedTables
作为bucketing的一个例子:
让我们看看如何在Hive 中创建分桶表。
分桶表只不过是传统数据库中的哈希分区。
我们需要指定CLUSTERED BY 子句以及INTO BUCKETS 来创建分桶表。
CREATE TABLE orders_buck (
order_id INT,
order_date STRING,
order_customer_id INT,
order_status STRING
) CLUSTERED BY (order_id) INTO 8 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
DESCRIBE FORMATTED orders_buck;
让我们看看如何将数据添加到分桶表中。
通常我们使用INSERT 命令将数据放入分桶表中,因为源数据可能与分桶表的标准不匹配。
如果数据在文件中,首先我们需要将数据放到stage中,然后插入到bucketed table中。
orders 表中已经有了数据,让我们用它来将数据插入到我们的分桶表orders_buck
hive.enforce.bucketing 应设置为 true。
以下是从常规托管表或外部表向分桶表中插入数据的示例。
SET hive.enforce.bucketing;
SET hive.enforce.bucketing=true;
INSERT INTO orders_buck
SELECT * FROM orders;
-- check out into the directory of the bucketed table if the
-- number of files is equal to number of buckets
dfs -ls /user/hive/warehouse/training_retail.db/orders_buck;
SELECT * FROM orders_buck TABLESAMPLE(BUCKET 1 OUT OF 2 ON order_id);
-- In my case this query works perfectly well