我是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替换为表格中的其他字段,则会返回该存储桶中的行。所以有人可以解释一下吗?
在这里,我为您提供了一些在存储表中创建和插入的提示。
Bucketing是一种用于提高Hive查询性能的方法。
桶将数据存储在单独的文件中,而不是在诸如分区之类的单独子目录中。它以有效的随机方式对数据进行划分,而不是像分区那样以可预测的方式进行划分。将记录插入存储桶表中时,Hive将计算指定存储桶列中值的哈希码,并使用这些哈希码将记录划分为存储桶。因此,有时将存储分区称为哈希分区。存储的目标是在预定义数量的存储桶中平均分配记录。如果所有联接表都存储在联接键列上,则存储桶可以提高联接的性能。
有关存储区的更多信息,请参见Hive语言手册中描述存储区表的页面,位于https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables。
作为存储桶的示例:
让我们看看如何在Hive中创建存储桶表。
Bucketed表不过是常规数据库中的哈希分区。我们需要指定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
我希望这会很高兴,
问候