sql - Hive 表采样和分桶
问题描述
我是 Hive 的新手,面临一些问题。我现在正在学习分桶,我的任务是创建一个包含 2 个桶的 Hive 表,然后将至少 5 条记录放入该表中。好吧,我认为那部分很清楚:
CREATE TABLE <tablename>(id INT,field2 STRING,field3 TINYINT) CLUSTERED BY(id) INTO 2 BUCKETS;
为了填充表,我只是使用 insert into values(...) 语句。我真的不知道以下内容 - 我必须运行此查询:
SELECT * FROM <tablename> TABLESAMPLE(BUCKET 1 OUT OF 2 ON id)
当我运行它时,它返回 0 行,我不知道为什么。我试图在互联网上查找它,但没有找到确切的答案。如果我将 id 替换为表中的其他字段,它将返回该存储桶中的行。那么有人可以解释一下吗?
解决方案
这里我给你一些在桶表中创建和插入的技巧。
分桶是一种提高Hive
查询性能的方法。
分桶将数据存储在单独的文件中,而不是像分区这样的单独的子目录。
它以有效的随机方式划分数据,而不是像分区那样以可预测的方式划分数据。
将记录插入分桶表时,Hive
计算指定分桶列中值的哈希码,并使用这些哈希码将记录划分为桶。
出于这个原因,分桶有时被称为散列分区。分桶的目标是将记录均匀地分布在预定义数量的桶中。
如果所有连接的表都在连接键列上进行分桶,则分桶可以提高连接的性能。
有关分桶的更多信息,请参阅描述分桶Hive
表的语言手册页面,位于BucketedTables
作为分桶的一个例子:
让我们看看如何在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
命令将数据放入分桶表中,因为源数据可能与分桶表的标准不匹配。如果数据在文件中,首先我们需要将数据放入暂存区,然后插入到分桶表中。
我们已经在订单表中有数据,让我们用来将数据插入到我们的分桶表中,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