【问题标题】:Hive tablesampling and bucketingHive 表采样和分桶
【发布时间】:2020-04-13 17:17:04
【问题描述】:

我是 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】:

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

    Bucketing是一种提高Hive查询性能的方法。

    分桶将数据存储在单独的文件中,而不是像分区那样单独的子目录。

    它以有效的随机方式划分数据,而不是像分区那样以可预测的方式划分数据。

    当记录插入分桶表时,Hive 计算指定分桶列中值的哈希码,并使用这些哈希码将记录划分为桶。

    因此,bucketing有时也称为hash partitioningbucketing 的目标是在预定义数量的 bucket 中平均分配记录。

    分桶如果所有连接的表都在连接键列上进行分桶,则可以提高连接的性能。

    有关分桶的更多信息,请参阅描述分桶表的Hive 语言手册页面,地址为BucketedTables

    作为bucketing的一个例子:

    让我们看看如何在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 命令将数据放入分桶表中,因为源数据可能与分桶表的标准不匹配。 如果数据在文件中,首先我们需要将数据放到stage中,然后插入到bucketed table中。

    orders 表中已经有了数据,让我们用它来将数据插入到我们的分桶表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
    

    【讨论】:

    • 谢谢,它成功了。对于 2 个中的第 1 个存储桶,我得到了结果,但是对于 2 个中的第 2 个存储桶,它失败并出现 ArrayIndexOutOfBoundsException 1。这是正常的还是有什么我不知道的?
    • 要了解存储桶的工作原理,请点击此链接:stackoverflow.com/questions/18781869/…。我认为它回答了你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多