在蜂巢中,快速分区还是快速分区?

时间:2018-03-09 18:39:05

标签: hadoop hive bigdata partitioning

这是我面临的面试问题,如果我们在HDFS中有1 TB的数据。 hive中的哪种方法为我们提供了更快的效果,即bucketingpartitioning?   我告诉他们,根据我们选择bucketingRewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] 的数据。但是面试官对我的答案不满意。

它应该是什么样的答案(以及例子)?

2 个答案:

答案 0 :(得分:0)

您的回答是正确的 - 这实际上取决于数据以及您想要对数据做些什么。

Partitioning用于以逻辑方式水平分配负载。它可以优化性能,但有时可能会导致分区内部的数量非常少。这会导致性能下降,因为mapreduce适用于比较大的小文件更大的文件。

此处bucketing可以提供帮助,因为bucketing可以保证bucketing列的所有数据保持在一起。例如。如果我们使用employee表并使用emp_id作为bucketing列,则此列的值将由用户定义的桶数进行散列(必须根据记录数进行优化)。具有相同emp_id的记录将始终存储在存储桶中。同时,一个存储桶可能有许多emp_id一起具有用于mapreduce处理的更优化的数据块。如果您要执行bucketing加入,则map-side会特别有用。

答案 1 :(得分:0)

你的答案是对的 -

Hive分区是提高较大表的查询性能的有效方法。分区允许您将数据存储在表位置下的单独子目录中。它极大地帮助了在分区键上查询的查询。

如果存储桶密钥和连接密钥很常见,则Bucketing可以提高连接性能。 Hive中的Bucketing根据桶密钥上的散列结果将数据分配到不同的桶中。如果进程发生在相同的键(列)上,它还会减少连接过程中的I / O扫描。