l => l говорит, что в качестве ключа будет использоваться вся строка (в вашем случае каждое слово при токенизации в пространстве). Таким образом, вы получите все вхождения каждого слова в одном разделе и сможете их подсчитать. - Как вы, вероятно, видели в других статьях, в этом случае предпочтительнее использовать reduceByKey, поэтому вам не нужно собирать все значения для каждого ключа в памяти перед подсчетом.
Вам нужна функция, которая извлекает ваш ключ из данных набора данных.
В вашем примере ваша функция принимает всю строку как есть и использует ее в качестве ключа. Другой пример - для набора данных [String] использовать в качестве ключа первые 3 символа вашей строки, а не всю строку:
scala> val ds = List("abcdef", "abcd", "cdef", "mnop").toDS
ds: org.apache.spark.sql.Dataset[String] = [value: string]
scala> ds.show
+------+
| value|
+------+
|abcdef|
| abcd|
| cdef|
| mnop|
+------+
scala> ds.groupByKey(l => l.substring(0,3)).keys.show
+-----+
|value|
+-----+
| cde|
| mno|
| abc|
+-----+
группа ключа «abc» будет иметь 2 значения.
Вот разница в том, как ключ преобразуется по сравнению с (l => l), чтобы вы могли лучше видеть:
scala> ds.groupByKey(l => l.substring(0,3)).count.show
+-----+--------+
|value|count(1)|
+-----+--------+
| cde| 1|
| mno| 1|
| abc| 2|
+-----+--------+
scala> ds.groupByKey(l => l).count.show
+------+--------+
| value|count(1)|
+------+--------+
| abcd| 1|
| cdef| 1|
|abcdef| 1|
| mnop| 1|
+------+--------+
person
Traian
schedule
16.02.2017