hadoop - Hive Buckets——理解TABLESAMPLE(BUCKET X OUT OF Y)

标签 hadoop mapreduce hive

您好,我是 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/

相关文章:

hadoop - 辅助namenode连接超时

hadoop - 并非所有节点都在集群中使用

sql - 双 "group by"没有加入?

hadoop - 群集创建-AWS-EMR-*:9000出现连接异常失败:java.net.ConnectException:连接被拒绝;

apache-spark - 分区失败,Spark2.4.3中的方法不存在错误

hadoop - 有没有办法使用 JDBC 作为 Hadoop 的 MapReduce 的输入资源?

hadoop - Hive Metastore高可用性

hadoop - Hive 选择查询中列名中的特殊字符 "#"

hadoop - 通过 JDBC 集成 Spark SQL 和 Apache Drill

java - Hadoop:在映射函数中有线程