Может кто-нибудь объяснить мне разницу между map и flatMap и каков хороший вариант использования для каждого?
Что значит «сгладить результаты»? Для чего это?
apache-spark
Эран Виткон
источник
источник
RDD.map
иRDD.flatMap
в Apache Spark . В целом, операции RDD в Spark моделируются после соответствующих операций сбора Scala. Ответы в stackoverflow.com/q/1059776/590203 , в которых обсуждается различие междуmap
иflatMap
в Scala, могут быть вам полезны.Ответы:
Вот пример разницы, как
spark-shell
сеанс:Во-первых, некоторые данные - две строки текста:
Теперь
map
преобразует СДР длины N в другой СДР длины N.Например, он отображается из двух строк в две длины строки:
Но
flatMap
(грубо говоря) преобразует СДР длины N в набор из N коллекций, а затем объединяет их в одну СДР результатов.У нас есть несколько слов в строке и несколько строк, но в итоге мы получаем один выходной массив слов
Просто чтобы проиллюстрировать это, flatMapping из набора строк в набор слов выглядит так:
Поэтому входные и выходные СДР обычно имеют разные размеры
flatMap
.Если бы мы попытались использовать
map
нашуsplit
функцию, мы бы получили вложенные структуры (СДР из массивов слов с типомRDD[Array[String]]
), потому что мы должны иметь ровно один результат на вход:Наконец, одним полезным частным случаем является сопоставление с функцией, которая может не возвращать ответ, и поэтому возвращает
Option
. Мы можем использоватьflatMap
для фильтрации элементов, которые возвращаютNone
и извлекать значения из тех, которые возвращаютSome
:(отмечая здесь, что Option ведет себя скорее как список, который имеет либо один элемент, либо ноль элементов)
источник
["a b c", "", "d"] => [["a","b","c"],[],["d"]]
?split
списка строк приведет к созданию списка массивов)Обычно мы используем пример подсчета слов в hadoop. Я возьму тот же вариант использования и буду использовать,
map
иflatMap
мы увидим разницу в том, как он обрабатывает данные.Ниже приведен пример файла данных.
Приведенный выше файл будет проанализирован с помощью
map
иflatMap
.С помощью
map
Вход имеет 4 строки, а размер вывода также равен 4, то есть N элементов ==> N элементов.
С помощью
flatMap
Вывод отличается от карты.
Давайте назначим 1 в качестве значения для каждого ключа, чтобы получить количество слов.
fm
: СДР, созданный с помощьюflatMap
wc
: СДР создан с использованиемmap
Принимая во внимание, что
flatMap
на RDDwc
выдаст следующие нежелательные выходные данные:Вы не можете получить количество слов, если
map
используется вместоflatMap
.Согласно определению, разница между
map
иflatMap
составляет:источник
.map(lambda line:line.split(" "))
является не массив строк. Вы должны изменитьdata.collect()
наwc.collect
и вы увидите массив массивов.wc.collect()
?Если вы спрашиваете разницу между RDD.map и RDD.flatMap в Spark, map преобразует RDD размера N в другой размер N. например.
например, если myRDD состоит из Doubles.
В то время как flatMap может преобразовать RDD в другой, другой размер: например:
который вернет СДР размером 2 * N или
источник
Это сводится к вашему первоначальному вопросу: что вы подразумеваете под сглаживанием ?
источник
Используйте
test.md
в качестве примера:Если вы используете
map
метод, вы получите строкиtest.md
, дляflatMap
метода вы получите количество слов.map
Метод подобенflatMap
, они все возвращаются новый РДД.map
метод часто использовать, чтобы вернуть новый RDD,flatMap
метод часто использовать разделенные слова.источник
map
возвращает СДР с равным количеством элементов, аflatMap
может и нет.Пример варианта использования для
flatMap
фильтрации отсутствующих или неверных данных.Пример
map
варианта использования для использования в самых разнообразных случаях, когда количество элементов ввода и вывода одинаково.number.csv
map.py добавляет все числа в add.csv.
flatMap.py использует
flatMap
для фильтрации отсутствующих данных перед добавлением. Меньше номеров добавлено по сравнению с предыдущей версией.источник
map и flatMap похожи в том смысле, что они берут строку из входного RDD и применяют к ней функцию. Они отличаются тем, что функция на карте возвращает только один элемент, а функция в flatMap может возвращать список элементов (0 или более) в качестве итератора.
Кроме того, вывод flatMap сглаживается. Хотя функция в flatMap возвращает список элементов, flatMap возвращает RDD, в котором все элементы из списка отображаются плоским способом (не списком).
источник
все примеры хороши .... Вот хорошая наглядная иллюстрация ... источник любезно: DataFlair обучение искры
Карта: карта - это операция преобразования в Apache Spark. Он применяется к каждому элементу СДР и возвращает результат как новый СДР. На карте разработчик операции может определить свою собственную бизнес-логику. Та же логика будет применяться ко всем элементам СДР.
map
Функция Spark RDD принимает один элемент в качестве входного процесса, обрабатывает его в соответствии с пользовательским кодом (указанным разработчиком) и возвращает один элемент за раз. Карта преобразует СДР длиной N в другой СДР длины N. Как правило, входные и выходные СДР имеют одинаковое количество записей.Пример
map
использования scala:FlatMap:
А
flatMap
является операцией преобразования. Он применяется к каждому элементу СДР и возвращает результат как новыйRDD
. Он похож на Map, но FlatMap позволяет возвращать 0, 1 или более элементов из функции карты. В операции FlatMap разработчик может определить свою собственную бизнес-логику. Та же логика будет применяться ко всем элементам СДР.Функция FlatMap принимает один элемент в качестве входного процесса, обрабатывает его в соответствии с пользовательским кодом (указанным разработчиком) и возвращает 0 или более элементов одновременно.
flatMap
() преобразует СДР длины N в другой СДР длины M.Пример
flatMap
использования scala:источник
Разницу можно увидеть из приведенного ниже примера кода pyspark:
источник
Flatmap и Map преобразуют коллекцию.
Разница:
map (func)
Возвращает новый распределенный набор данных, сформированный путем передачи каждого элемента источника через функцию func.
flatMap (func)
Аналогично map, но каждый входной элемент может быть сопоставлен с 0 или более выходными элементами (поэтому func должен возвращать Seq, а не один элемент).
Функция преобразования:
map : один элемент в -> один элемент в.
flatMap : один элемент в -> 0 или более элементов (коллекция).
источник
RDD.map
возвращает все элементы в одном массивеRDD.flatMap
возвращает элементы в массивах массивадавайте предположим, что у нас есть текст в файле text.txt как
Используя карту
вывод:
Использование flatMap
вывод:
источник
Для всех тех, кто хотел PySpark связанных:
Пример преобразования: flatMap
['Привет, чем занимаешься']
Traceback (последний вызов был последним): файл "", строка 1, в AttributeError: объект list не имеет атрибута split
[['привет', 'что', 'есть', 'ты', 'делаешь'], ['this', 'is', 'rak']]
['привет', 'что', 'есть', 'ты', 'делаешь', 'это', 'есть', 'rak']
Надеюсь, поможет :)
источник
map
: Возвращает новоеRDD
, применяя функцию к каждому элементуRDD
. Функция в .map может вернуть только один элемент.flatMap
: Подобно карте, он возвращает новоеRDD
, применяя функцию к каждому элементу СДР, но вывод выравнивается.Также функция in
flatMap
может возвращать список элементов (0 или более)Например:
Источник: https://www.linkedin.com/pulse/difference-between-map-flatmap-transformations-spark-pyspark-pandey/
источник
карта :
это метод более высокого порядка, который принимает функцию в качестве входных данных и применяет ее к каждому элементу в исходном СДР.
http://commandstech.com/difference-between-map-and-flatmap-in-spark-what-is-map-and-flatmap-with-examples/
flatMap:
метод более высокого порядка и операция преобразования, которая принимает входную функцию.
источник
Разница в выводе карты и flatMap:
1.
flatMap
Вывод:
2
map
.:Вывод:
источник
в то время как
источник