在Hive *中以相同的方式划分两个*大*表有助于执行更高效的连接吗?

时间:2015-12-14 17:18:03

标签: join hive bigdata

想象一下我正在计划的以下情况:

  1. 在Hive中存储了两个相当大的表,两个表都包含不同类型的客户相关信息(例如,虽然情况并非如此,但在一个客户交易记录和另一个客户拥有的数据中)。 让我们调用表A和B
  2. 表格很大,因为没有一个表完全适合内存。 (在这两个表中,每个客户都有1000万客户,并且每个客户都有几千字节的信息)
  3. 要小心,以完全相同的方式,通过两个表中的字段(customer_id,这是一个bigint)和使用相同数量的存储桶100来存储两个表。
  4. 我想知道这个设置是否会以任何方式保证两个表之间的连接(通过customer_id)将是高效的,因为节点之间的信息非常小的混乱将是必需的。 我想这可能是这种情况,例如,如果有保证两个表中相同存储桶对应的物理文件物理存储在相同的(节点集)中,即如果每个存储桶i(在[0,99])文件A / part_0_000i和文件B / part_0_000i物理地存储在相同的节点中,并且为它们的副本保存相同的文件。

    注意:

    • 我知道分区和分段是不同的,第一个主要决定子目录的结构,而第二个决定每个记录的文件也是如此。 此问题仅适用于分组

    • 此外,通过数字2,地图侧联接不是一个选项,因为就我的说法而言,它们需要在每个映射器中完全加载其中一个表格在那里完成连接。

2 个答案:

答案 0 :(得分:2)

是的,一定会有所帮助。 分区表格以相同的方式进行分区和排序,因此它们将被合并排序,这在线性时间(n)中起作用,否则表格必须首先以相同的方式排序,这通常是nlog(n)

答案 1 :(得分:1)

当数据中有太多级别要分区时,或者没有好的候选分区时,会使用暂停。

一个具体的例子是在销售数据中对customerID进行分区。您可能拥有2万名客户。分区将包含少量数据,这些数据效率低,并且分区太多也效率低下。但是,您可以将customerID和分区哈希到50个桶中。然后,当您合并customerID时,作业只需要扫描存储桶中的内容而不是所有数据的全部总和。

通过理想的分段,您的存储桶应包含文件系统块大小的多个。还要记住,在varialbes上构建的太多桶或桶不用作密钥可能对其他查询不利。

当我需要反复执行大型作业时,我已经使用过它们。我的查询时间大大减少了。我倾向于只使用我的数据非常大的时候。而且大与集群规模和容量有关。

关于分组的一个好处是它们有助于确保分区大小相似。例如,如果您在State上进行分区,那么California将拥有巨大的分区,而其他状态非常小。

Bucketing是战术性的,并不适合所有用例。快乐的啤酒!