2015-03-26 3 views
38

RDD имеет значащий (в отличие от случайного порядка, заданного моделью хранения), если он был обработан sortBy(), как объяснено в этом reply.Какие операции сохраняют заказ RDD?

Какие операции сохранить, что заказ?

Е.Г., это гарантируется, что (после a.sortBy())

a.map(f).zip(a) === 
a.map(x => (f(x),x)) 

Как насчет

a.filter(f).map(g) === 
a.map(x => (x,g(x))).filter(f(_._1)).map(_._2) 

насчет

a.filter(f).flatMap(g) === 
a.flatMap(x => g(x).map((x,_))).filter(f(_._1)).map(_._2) 

Здесь "равенство" === понимается как «функциональная эквивалентность», то есть невозможно отличить результат с использованием операций на уровне пользователя (то есть без чтения журналов & c).

+0

Я думаю, что любая операция, которая изменяет элементы в RDD, не может быть сохранена. например. 'IntRdd.map (х => х * -1)'. На rdds с ключом есть выделенные операции, которые сохраняют порядок 'pairRDD.mapValues' и pairRDD.flatMapValues' - не уверены, есть ли обобщение, которое могло бы удовлетворить этот вопрос - следовательно, комментарий. – maasg

+0

RDD неизменяемы; все операции создают новые RDD. – sds

+0

Итак, я думаю, у вас есть свой собственный ответ, верно? – maasg

ответ

39

Все операции сохраняют заказ, за ​​исключением тех, которые явно нет. Заказ всегда «значим», а не только после sortBy. Например, если вы читаете файл (sc.textFile), строки RDD будут находиться в том порядке, в котором они были в файле.

Не пытаясь дать полный список, map, filter, flatMap и coalesceshuffle=false) сделать сохранить порядок. sortBy, partitionBy, join не сохраняют заказ.

Причина в том, что большинство операций с RDD работают на Iterator с внутри разделов. Таким образом, map или filter просто не может испортить заказ. Вы можете посмотреть на code, чтобы убедиться сами.

Теперь вы можете спросить: что делать, если у меня есть RDD с HashPartitioner. Что происходит, когда я использую map для изменения ключей? Ну, они останутся на месте, и теперь RDD не разделяется ключом. Вы можете использовать partitionBy для восстановления разбиения с помощью тасования.

+1

Daniel, я тоже ожидал чего-то подобного, и только шаг в случайном порядке нарушил порядок, но кажется, что упорядочение RDD является совпадением, а не контрактным. Это была хорошая тема: https: //issues.apache.org/jira/browse/SPARK-3098 То, что я не понимаю, это вопрос после получения этой информации по предыдущему вопросу: http://stackoverflow.com/questions/29268210/mind-blown-rdd-zip-method/29281548 # 29268210 – maasg

+0

Я не читал SPARK-3098 полностью, но он использует 'distinct'. 'distinct' должен построить хэш-карту строк, поэтому он теряет порядок. В другом вопросе я думаю, что Шон говорит то же самое, что у RDD есть заказ. Они не мультисети. –

+5

Я могу подтвердить, что перераспределение делает * не * сохранить порядок, насколько я могу судить. Если я запустил 'x = sc.textFile ('somefile'); y = x.repartition (100); a = x.collect(); b = y.collect() ', то' a == b' возвращает 'False'. – moustachio

Смежные вопросы