Hive Buckets-了解TABLESAMPLE(BUCKET X OUT OF Y)

use*_*111 5 hadoop hive mapreduce

嗨,我非常喜欢蜂巢,我已经通过hadoop行动中的桶概念,但未能理解下面的行.任何人都可以帮助我吗?

SELECT avg(viewTime)
 FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 32);
Run Code Online (Sandbox Code Playgroud)

TABLESAMPLE的一般语法是TABLESAMPLE(BUCKET x OUT OF y)

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

SELECT avg(viewTime)
 FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 16);
Run Code Online (Sandbox Code Playgroud)

然后,样本大小包括每16个用户中的大约1个(因为桶列是用户ID).该表仍有32个桶,但Hive尝试通过一起处理桶1和17来满足此查询.另一方面,如果y被指定为64,则Hive将对一个桶中的一半数据执行查询.x的值仅用于选择要使用的存储桶.在真正的随机抽样下,它的价值无关紧要.

bbk*_*glb 11

你明白哪一部分不明白?

当您创建表并使用该clustered by子句将其存储到32个桶中时(作为示例),hive使用确定性散列函数将数据存储到32个桶中.然后在使用时TABLESAMPLE(BUCKET x OUT OF y),hive将您的桶分成y个桶组,然后选择每个组的第x个桶.例如:

  • 如果你使用TABLESAMPLE(BUCKET 6 OUT OF 8),hive会将你的32个桶分成8个桶组,产生4组8个桶,然后挑选每组的第6个桶,因此挑选桶6,14,22,30.

  • 如果你使用TABLESAMPLE(BUCKET 23 OUT OF 32),hive会将你的32个桶分成32个组,只产生一组32个桶,然后选择第23个桶作为你的结果.

  • 如果你使用TABLESAMPLE(BUCKET 3 OUT OF 64),hive会将你的32个桶分成64个桶组,产生1组64"半桶",然后选择与第3个满桶相对应的半桶.