首页 > 解决方案 > 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 替换为表中的其他字段,它将返回该存储桶中的行。那么有人可以解释一下吗?

标签: sqlhivehiveql

解决方案


这里我给你一些在桶表中创建和插入的技巧。

分桶是一种提高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

推荐阅读