groupByKey в наборе данных Spark

Пожалуйста, помогите мне понять параметр, который мы передаем в groupByKey, когда он используется в наборе данных.

scala> val data = spark.read.text("Sample.txt").as[String]
data: org.apache.spark.sql.Dataset[String] = [value: string]

scala> data.flatMap(_.split(" ")).groupByKey(l=>l).count.show

В приведенном выше коде помогите мне понять, что означает (l => l) в groupByKey (l => l).


person Sudha    schedule 16.02.2017    source источник


Ответы (1)


l => l говорит, что в качестве ключа будет использоваться вся строка (в вашем случае каждое слово при токенизации в пространстве). Таким образом, вы получите все вхождения каждого слова в одном разделе и сможете их подсчитать. - Как вы, вероятно, видели в других статьях, в этом случае предпочтительнее использовать reduceByKey, поэтому вам не нужно собирать все значения для каждого ключа в памяти перед подсчетом.

  • Всегда полезно начать с документации по API: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset

    def groupByKey [K] (func: (T) ⇒ K) (неявный arg0: Encoder [K]): KeyValueGroupedDataset [K, T] (специфично для Scala) Возвращает KeyValueGroupedDataset, в котором данные сгруппированы по заданной ключевой функции.

Вам нужна функция, которая извлекает ваш ключ из данных набора данных.

В вашем примере ваша функция принимает всю строку как есть и использует ее в качестве ключа. Другой пример - для набора данных [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