Поведение карты и flatMap с десятичной точкой - PullRequest
0 голосов
/ 11 марта 2019

Рассмотрим этот набор данных рейтинга фильмов (userId, movieId, rating, timestamp)

1,1,4.0,964982703
1,3,4.0,964981247
1,223,3.0,964980985
1,231,5.0,964981179
1,1226,5.0,964983618
6,95,4.0,845553559
6,100,3.0,845555151
6,102,1.0,845555436
6,104,4.0,845554349
6,105,3.0,845553757
6,110,5.0,845553283
6,112,4.0,845553994
610,152081,4.0,1493846503
610,152372,3.5,1493848841
610,155064,3.5,1493848456
610,156371,5.0,1479542831
610,156726,4.5,1493848444
610,157296,4.0,1493846563
610,158238,5.0,1479545219
610,158721,3.5,1479542491
610,160080,3.0,1493848031
610,160341,2.5,1479545749
610,160527,4.5,1479544998

m = sc.textFile('movies/ratings_s.csv')

Для гистограммы рейтинга я понимаю, что мы можем сделать следующее

scores = m.map(lambda line : line.split(',')[2])
sorted(scores.countByValue().items())

[(«1,0», 1), («2,5», 1), («3,0», 4), («3,5», 3), («4,0», 7), («4,5», 2), ('5,0', 5)]

Я попробовал flatMap просто, чтобы понять разницу:

scores = m.flatMap(lambda line : line.split(',')[2])
sorted(scores.countByValue().items())

Результат, который у меня был

[('.', 23), ('0', 17), ('1', 1), ('2', 1), ('3', 7), ('4', 9 ), ('5', 11)]

Не могли бы вы помочь объяснить поведение flatMap здесь:

  1. Какую логику выполняет flatMap? Что значит "сгладить", чтобы создать такой результат?

  2. Почему это раздевается "." отдельно и оставить только неотъемлемую часть? Мы не просим расстаться с "."

  3. Как вернуть десятичные результаты с результатом .5?

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Какую логику выполняет flatMap?Что означает «выравнивание» для создания такого результата?

flatMap принимает функцию, которая возвращает «коллекцию» (например, список).По сути это эквивалентно выполнению map для возврата коллекции, которая далее flattened, в отдельные элементы.В вашем примере flatMap функция lambda line : line.split(',')[2] преобразует каждую строку в 3-ю разделенную строку, которая (при просмотре в виде набора символов) затем становится flattened в отдельные символы.

Почемуэто раздевается "."отдельно и оставить только неотъемлемую часть?Мы не просим разделить с помощью "."

Поскольку результатом flatMap теперь является список отдельных символов 3-й строки разделения каждой строки, countByValue() будет считать каждыйчисловых цифр и десятичных знаков (в виде символов), отсюда и сообщаемый результат.

Как вернуть десятичные результаты с результатом .5?

Если вывы хотите использовать flatMap для получения того же результата, что и ваша map версия:

m.map(lambda line : line.split(',')[2])

, вам нужно будет заставить лямбда-функцию возвращать правильную коллекцию выбранных разделенных строк, например:

m.flatMap(lambda line : [line.split(',')[2]])
0 голосов
/ 11 марта 2019

Какова логика, которую делает flatMap? Что значит "сплющить", чтобы создать такой результат?

Ответ - line.split (',') [2] возвращает строку. Flatmap сглаживает строку (когда вы выравниваете строку, вы получаете символы, потому что строка представляет собой комбинацию символов), то есть создает символы из строки, поэтому вы видите один символ в выходных данных.

Почему это раздевается "." отдельно и оставить только неотъемлемую часть? Мы не просим расстаться с "." Ответ. Ответ, приведенный выше, объясняет, почему не используется «.»

Как мне вернуть десятичные результаты с .5 Гол ? Ответ - опять же, выше ответ должен объяснить, что вам нужно сделать. Для работы с числами вы можете отобразить дальше от строки до числа, а затем рассчитать.

Пожалуйста, примите ответ, если он решит.

...