Lookup Stage和Join Stage是十分好用的两个Stage,在工作中会经常会用到,但是如果采用的分区方法不恰当,则会造成错误的结果。我们先来看一个例子。
假设服务器配置为两个Node,有如下两个表:
员工销售表
EmpId ProductId Amount
1 1 100
1 2 450
2 1 250
2 2 234
3 1 340
员工信息表
EmpId Name
1 John
2 Jack
3 Bill
假设采用Round robin分区方式
员工销售表.Partition1
EmpId ProductId Amount
1 1 100
2 1 250
3 1 340
员工销售表.Partition2
EmpId ProductId Amount
1 2 450
2 2 234
员工信息表.Partition1
EmpId Name
1 John
3 Bill
员工信息表.Partition2
EmpId Name
2 Jack
因为计算只发生在同一个分区中,即:员工销售表.Partition1与员工信息表.Partition1进行运算(这里丢失了2 1 250这条员工销售数据),员工销售表.Partition2与员工信息表.Partition2进行运算(这里丢失了1 2 450这条员工销售数据)。可以看到,采用Round robin分区方式造成了数据的丢失
如果采用Hash分区方式,则
员工销售表.Partition1
EmpId ProductId Amount
1 1 100
1 2 450
3 1 340
员工销售表.Partition2
EmpId ProductId Amount
2 1 250
2 2 234
员工信息表.Partition1
EmpId Name
1 John
3 Bill
员工信息表.Partition2
EmpId Name
2 Jack
可以看到,运算结果是正确的。
总结:在Lookup和Join中,采用什么分区方法有一个原则,即关键字字段具有相同特征的数据必须分到同一个分区中(例如关健字为单数的分到Partition1,关健字为双数的分到Partition2)。可见,不适用的分区方法有Auto、Random、Round robin、Same、DB2,因为它们有可能造成数据的丢失,适用的分区方法有Entire(适合于某个表的数据量比较少的情况)、Hash、Modulus、Range。一般来说,推荐使用Hash的分区方法。
2012-04-09 22:29