您好,我是 Hive 的新手,我已经了解了 hadoop 中的桶概念,但未能理解以下几行。有人可以帮助我吗?
SELECT avg(viewTime)
FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 32);
TABLESAMPLE 的一般语法是 表样本(从 y 中取出 x 桶)
查询的样本量约为 1/y。此外,y 需要是创建表时为表指定的桶数的倍数或因数。例如,如果我们将 y 更改为 16,则查询变为
SELECT avg(viewTime)
FROM page_view TABLESAMPLE(BUCKET 1 OUT OF 16);
那么样本量大约包括每 16 个用户中的 1 个(因为 bucket 列是 userid)。该表仍有 32 个存储桶,但 Hive 尝试通过同时处理存储桶 1 和 17 来满足此查询。另一方面,如果 y 指定为 64,则 Hive 将对一个桶中的一半数据执行查询。 x 的值仅用于选择使用哪个桶。在真正随机抽样的情况下,它的值应该无关紧要。
最佳答案
哪一部分你不明白?
当您创建表并使用 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 OF 32)
,hive 会将您的 32 个桶分成 32 个一组,结果只有一组 32 个桶,然后选择第 23 个桶作为你的结果。如果您使用
TABLESAMPLE(BUCKET 3 OUT OF 64)
,hive 会将您的 32 个桶分成每组 64 个桶,从而产生一组 64 个“半桶”和然后选择与第 3 个全桶对应的半桶。
关于hadoop - Hive Buckets——理解TABLESAMPLE(BUCKET X OUT OF Y),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18781869/