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

时间:2013-09-13 08:39:06

标签: hadoop mapreduce hive

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:10)

你明白哪一部分不明白?

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

  • 如果您使用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"半桶" s然后选择一半 - 与第3个满桶相对应的桶。