数据科学家=统计学家+程序员+讲故事的人+艺术家。 – Shlomo Aragmon
答案: ABC

常用的数据分区方法包括三种:

  • 水平划分
  • Hash划分(HashPartitioner)
  • Range划分(RangePartitioner)

水平划分

按照record的索引进行划分。例如,我们经常使用的sparkContext.parallelizelist(list(1,2,3,4,5,6,8,9),3),就是按照元素的下标划分,(1,2,3)为一组,(4,5,6)为一组,(7,8,9)为一组。

Hash划分(HashPartitioner)

使用record的Hash值来对数据进行划分,该划分的好处是只需要知道分区个数,就能将数据确定性地划分到某个分区。在水平划分中,由于没每个RDD中的元素数目和排列顺序不固定,同一个元素在不同RDD中可能被划分到不同分区。而使用HashPartitioner,可以根据元素的Hash值,确定性地得出该元素的分区。该划分方法经常被用于数据的Shuffle阶段。

Range划分(RangePartitioner)

该方法一般适用于排序任务,核心思想是按照元素的大小关系将其划分到不同分区,每个分区表示一个数据区域。例如,我们想对一个数组进行排序,数组里面每个数字是[0,100]中的随机数,Range划分首先将上下界[0,100]划分为若干份(如10份),然后将数组中的每个数字分发到相应的分区,如将18分发到(10,20)的分区,最后对每个分区进行排序,这个排序过程可以并行执行,排序完成后是全局有序的的结果。Range划分需要提前划分数据区域,因此需要统计RDD中数据的最小值和最大值。为了简化这个统计过程,Range划分经常采用抽样方法来估算数据区域边界。

;
版权声明: 本文为智客工坊「楠木大叔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""