Я работаю над этими двумя концепциями прямо сейчас и хочу получить некоторую ясность. Из командной строки я пытаюсь определить различия и когда разработчик будет использовать repartition vs partitionBy.
Вот пример кода:
rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 1), ('b', 3), ('c',1), ('ef',5)])
rdd1 = rdd.repartition(4)
rdd2 = rdd.partitionBy(4)
rdd1.glom().collect()
[[('b', 1), ('ef', 5)], [], [], [('a', 1), ('a', 2), ('b', 3), ('c', 1)]]
rdd2.glom().collect()
[[('a', 1), ('a', 2)], [], [('c', 1)], [('b', 1), ('b', 3), ('ef', 5)]]
Я взглянул на реализацию обоих, и единственная разница, которую я заметил по большей части, заключается в том, что partitionBy может выполнять функцию разбиения по секциям или использовать по умолчанию портативный_хаши. Поэтому в разделе partitionBy все те же ключи должны находиться в одном разделе. В перераспределении я ожидал бы, что значения будут распределяться более равномерно по разделам, но это не так.
Учитывая это, почему кто-либо когда-либо использовал передел? Я полагаю, что единственный раз, когда я мог видеть, что он используется, - это если я не работаю с PairRDD, или у меня большой обход данных?
Есть ли что-то, что мне не хватает, или кто-то может пролить свет под другим углом для меня?