我是Hive的新手,遇到了一些问题。我现在正在学习存储桶,我的任务是创建一个包含2个存储桶的Hive表,然后将至少5条记录放入该表中。好吧,我认为这一部分很清楚:
CREATE TABLE <tablename>(id INT,field2 STRING,field3 TINYINT) CLUSTERED BY(id) INTO 2 BUCKETS;
为了填充表,我只使用了插入values(...)语句中。我真正不知道的是以下内容-我必须运行此查询:
SELECT * FROM <tablename> TABLESAMPLE(BUCKET 1 OUT OF 2 ON id)
当我运行它时,它将返回0行,但我不知道为什么。我试图在互联网上查找它,但没有找到确切答案。如果我将ID替换为表格中的其他字段,则会返回该存储桶中的行。有人可以解释一下吗?
答案 0 :(得分:0)
在这里,我为您提供了一些在存储表中创建和插入的提示。
分包是一种改善Hive
查询性能的方法。
装桶将数据存储在单独的文件中,而不是在分区等单独的子目录中存储。
它以有效的随机方式对数据进行划分,而不是像分区那样以可预测的方式进行划分。
将记录插入存储桶表中时,Hive
将计算指定存储桶列中值的哈希码,并使用这些哈希码将记录划分为存储桶。
因此,存储桶有时也称为哈希分区。 存储桶的目标是在预定数量的存储桶中平均分配记录。
如果所有联接表都存储在联接键列上,则包围可以提高联接的性能。
有关存储桶的更多信息,请参见Hive
语言手册中描述存储桶表的页面,位于BucketedTables
以存储桶为例:
让我们看看如何在Hive
中创建存储桶表。
带括号的表不过是常规数据库中的哈希分区。
我们需要指定CLUSTERED BY
子句以及INTO BUCKETS
来创建Bucketed表。
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