想象一下我正在计划的以下情况:
我想知道这个设置是否会以任何方式保证两个表之间的连接(通过customer_id)将是高效的,因为节点之间的信息非常小的混乱将是必需的。 我想这可能是这种情况,例如,如果有保证两个表中相同存储桶对应的物理文件物理存储在相同的(节点集)中,即如果每个存储桶i(在[0,99])文件A / part_0_000i和文件B / part_0_000i物理地存储在相同的节点中,并且为它们的副本保存相同的文件。
注意:
我知道分区和分段是不同的,第一个主要决定子目录的结构,而第二个决定每个记录的文件也是如此。 此问题仅适用于分组
此外,通过数字2,地图侧联接不是一个选项,因为就我的说法而言,它们需要在每个映射器中完全加载其中一个表格在那里完成连接。
答案 0 :(得分:2)
是的,一定会有所帮助。 分区表格以相同的方式进行分区和排序,因此它们将被合并排序,这在线性时间(n)中起作用,否则表格必须首先以相同的方式排序,这通常是nlog(n)
答案 1 :(得分:1)
当数据中有太多级别要分区时,或者没有好的候选分区时,会使用暂停。
一个具体的例子是在销售数据中对customerID进行分区。您可能拥有2万名客户。分区将包含少量数据,这些数据效率低,并且分区太多也效率低下。但是,您可以将customerID和分区哈希到50个桶中。然后,当您合并customerID时,作业只需要扫描存储桶中的内容而不是所有数据的全部总和。
通过理想的分段,您的存储桶应包含文件系统块大小的多个。还要记住,在varialbes上构建的太多桶或桶不用作密钥可能对其他查询不利。
当我需要反复执行大型作业时,我已经使用过它们。我的查询时间大大减少了。我倾向于只使用我的数据非常大的时候。而且大与集群规模和容量有关。
关于分组的一个好处是它们有助于确保分区大小相似。例如,如果您在State上进行分区,那么California将拥有巨大的分区,而其他状态非常小。
Bucketing是战术性的,并不适合所有用例。快乐的啤酒!