Я бы порекомендовал преобразовать Dataset
в RDD
, используя Dataset.rdd
, а затем RDD.foreachPartition
.
val names = Seq("hello", "world").toDF("name")
scala> names.show
+-----+
| name|
+-----+
|hello|
|world|
+-----+
scala> names.rdd.foreachPartition(p => p.map(n => "call restful service for " + n).foreach(println))
call restful service for [hello]
call restful service for [world]
Затем можно подумать о локальном кэше для тех же записей, чтобы избежатьдорогостоящие сервисные звонки, требующие времени*RDD.foreachPartition
дает вам доступ ко всем элементам в качестве итератора (ленивый и дружественный к памяти), поэтому вы можете избежать внешних вызовов, используя локальный кеш (для каждого раздела или для каждого исполнителя, чтобы все разделы / задачи, выполняемые на исполнителе, могли использоватькеш).
Количество разделов можно изменить, чтобы избежать слишком большого количества параллельных внешних вызовов (DDOS).Используйте операторы RDD.repartition
или RDD.coalesce
.Более того, вы можете контролировать количество разделов по источнику данных, который вы используете для чтения набора данных.
Как обновить соответствующий столбец после получения ответа от API
Поскольку вы покинули Dataset API и хотите использовать RDD API для внешних вызовов, вопрос заключается в том, как вернуться из RDD в наборы данных.Это так же просто, как RDD.toDF(comma-separated column names)
.Столбцы должны соответствовать представлению СДР и соответствовать классу дел СДР.