Чего вы хотите достичь с помощью многопоточности? В искровом приложении вам не нужно беспокоиться о количестве потоков и т. Д. c. Ваш код выполняет запуск параллельных заданий (многопоточность только на драйвере), для исполнителей разницы нет.
По моему опыту, я использую параллельные запуски заданий, только если у меня несколько небольшие или искаженные задания, например ресурсы кластера, используются не полностью. Если я это сделаю, я использую скалярные параллельные коллекции.
Чтобы ответить на ваш вопрос: оптимальное число, если потоки, вероятно, 1
РЕДАКТИРОВАТЬ: я бы предложил переписать ваш код полностью с целью иметь все результаты в новом фрейме данных, это лучше, чем реализация сложной многопоточности:
// testcase
val baseDf = Seq(
"6fefc487-bd57-4fa2-808a-3845703b83d0",
"9baba76b-07c2-48ec-a153-6cfb8b138ecf",
"ab654369-77f5-478c-94e5-ee2755ae8571",
"dummy"
).toDF("col1")
var array1 = Seq("6fefc487-bd57-4fa2-808a-3845703b83d0", "9baba76b-07c2-48ec-a153-6cfb8b138ecf")
var array2 = Seq("ab654369-77f5-478c-94e5-ee2755ae8571", "3b43e0a6-deba-4919-a2cc-9d450e28e0fe")
var storage = Seq(array1, array2)
broadcast(storage.toDF("storage"))
.join(baseDf,array_contains($"storage",$"col1"),"left")
.groupBy($"storage").agg(count($"col1").as("count"))
.show()
дает:
+--------------------+-----+
| storage|count|
+--------------------+-----+
|[ab654369-77f5-47...| 1|
|[6fefc487-bd57-4f...| 2|
+--------------------+-----+