这是我面临的面试问题,如果我们在HDFS中有1 TB的数据。 hive中的哪种方法为我们提供了更快的效果,即bucketing
或partitioning
?
我告诉他们,根据我们选择bucketing
或RewriteEngine 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]
的数据。但是面试官对我的答案不满意。
它应该是什么样的答案(以及例子)?
答案 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扫描。