Hadoop 蜂巢桶示例(桶X/Y)

Hadoop 蜂巢桶示例(桶X/Y),hadoop,mapreduce,hive,Hadoop,Mapreduce,Hive,您好,我对hive非常陌生,我已经在hadoop中了解了Bucket的概念,但是没有理解下面的内容。有人能帮我吗 SELECT avg(viewTime) FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 32); TABLESAMPLE的一般语法是 表样本(桶x/y) 查询的样本量约为1/y。此外,y需要是创建表时为表指定的存储桶数的倍数或因子。例如,如果将y更改为16,则查询将变为 SELECT avg(viewTime) FROM page_vie

您好,我对hive非常陌生,我已经在hadoop中了解了Bucket的概念,但是没有理解下面的内容。有人能帮我吗

SELECT avg(viewTime)
 FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 32);
TABLESAMPLE的一般语法是 表样本(桶x/y)

查询的样本量约为1/y。此外,y需要是创建表时为表指定的存储桶数的倍数或因子。例如,如果将y更改为16,则查询将变为

SELECT avg(viewTime)
 FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 16);

然后,样本量大约包括每16个用户中的1个(因为bucket列是userid)。该表仍然有32个存储桶,但配置单元试图通过同时处理存储桶1和17来满足此查询。另一方面,如果y被指定为64,那么配置单元将对一个bucket中的一半数据执行查询。x值仅用于选择要使用的铲斗。在真正的随机抽样下,它的值应该无关紧要。

你不明白它的哪一部分

当您使用
clustered by
子句创建表并将其存储到32个存储桶中时(例如),hive使用确定性哈希函数将数据存储到32个存储桶中。然后,当您使用
TABLESAMPLE(BUCKET x OF y)
时,hive会将您的BUCKET分成y个BUCKET组,然后选择每组的x。例如:

  • 如果使用
    表示例(8个桶中的6个)
    ,hive会将32个桶分成8个桶的组,形成4组8个桶,然后拾取每组中的第6个桶,从而拾取桶6、14、22、30

  • 如果使用
    TABLESAMPLE(32个桶中的23个)
    ,hive会将32个桶分成32个一组,结果只有一组32个桶,然后选择第23个桶作为结果

  • 如果使用
    TABLESAMPLE(64个桶中的第3个)
    ,hive会将32个桶分成64个桶的组,形成一组64个“半桶”,然后拾取对应于第三个满桶的半桶