9

嗨,我对 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 个(因为桶列是 userid)。该表仍有 32 个存储桶,但 Hive 尝试通过同时处理存储桶 1 和 17 来满足此查询。另一方面,如果 y 指定为 64,Hive 将对一个桶中的一半数据执行查询。x 的值仅用于选择要使用的存储桶。在真正随机抽样下,它的值应该无关紧要。

4

1 回答 1

15

哪一部分你不明白?

当您创建表并使用该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 个一组,导致只有 1 组 32 个桶,然后选择第 23 个桶作为您的结果。

  • 如果您使用TABLESAMPLE(BUCKET 3 OUT OF 64),hive 会将您的 32 个桶分成 64 个桶组,从而产生 1 组 64 个“半桶”,然后选择对应于第 3 个全桶的半桶。

于 2014-08-12T21:20:24.930 回答