Почему метод foreach набора данных не требует кодировщика, а карта требует? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть два набора данных: Dataset[User] и Dataset[Book], где оба User и Book являются классами наблюдений. Я присоединяюсь к ним так:

val joinDS = ds1.join(ds2, "userid")

Если я пытаюсь map для каждого элемента в joinDS, компилятор жалуется, что отсутствует кодер:

not enough arguments for method map: (implicit evidence$46: org.apache.spark.sql.Encoder[Unit])org.apache.spark.sql.Dataset[Unit]. Unspecified value parameter evidence$46. Unable to find encoder for type stored in a Dataset.

Но та же ошибка не возникает, если я использую foreach вместо map. Почему foreach также не требуется кодер? Я уже импортировал все импликации из сеанса spark, так почему же map вообще требует кодировщик, когда набор данных является результатом объединения двух наборов данных, содержащих классы дел)? Кроме того, какой тип данных я получаю из этого объединения? Это Dataset[Row] или что-то еще?

1 Ответ

0 голосов
/ 08 ноября 2018

TL; DR Encoder требуется для преобразования результата во внутренний формат Spark SQL, и в этом нет необходимости в случае foreach (или любого другого приемника).

Просто взгляните на подписи. map -

def map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U] 

Таким образом, в простых словах он преобразует записи из T в U, а затем использует Encoder из U для преобразования результата во внутреннее представление.

foreach с другой стороны, это

def foreach(f: (T) ⇒ Unit): Unit 

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

...