配置单元表采样和存储分区

问题描述 投票:0回答:1

我是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替换为表格中的其他字段,则会返回该存储桶中的行。所以有人可以解释一下吗?

sql hive hiveql
1个回答
0
投票

在这里,我为您提供了一些在存储表中创建和插入的提示。

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

我希望这会很高兴,

问候

© www.soinside.com 2019 - 2024. All rights reserved.