Как сделать спокойные вызовы службы для быстрого обновления столбца данных? - PullRequest
1 голос
/ 21 сентября 2019

Нам нужно вызвать внешнюю службу restful, чтобы обновить значение столбца в Dataset.Мы используем функцию UDF для выполнения спокойных вызовов службы, что очень медленно.

dataset.withColumn("upper", upperUDF('call restful service'))

Это синхронный вызов, который занимает ~ 1 час и 10 минут для 25 000 учетных записей (каждая учетная запись выполняет вызов).

Как сделать это быстрее?

1 Ответ

2 голосов
/ 22 сентября 2019

Я бы порекомендовал преобразовать 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).Столбцы должны соответствовать представлению СДР и соответствовать классу дел СДР.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...