Подтвердить что ты не робот

Какие операции сохраняют порядок RDD?

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

Теперь, какие операции сохранить упорядочены?

Например, гарантировано, что (после 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)

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

4b9b3361

Ответ 1

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

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

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

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