Вот решение с одним утверждением
orginalMap
.map{case (k, v)=>value.map{v2=>(v2,k)}}
.flatten
.groupBy{_._1}
.transform {(k, v)=>v.unzip._2.toSet}
Этот бит довольно аккуратно (*) создает кортежи, необходимые для построения обратной карты
Map(1 -> Set("a", "b"),
2 -> Set("b", "c"),
3 -> Set("c", "d"))
.map{case (k, v)=>v.map{v2=>(v2,k)}}.flatten
производит
List((a,1), (b,1), (b,2), (c,2), (c,3), (d,3))
Преобразование этого непосредственно в карту перезаписывает значения, соответствующие дублирующимся ключам, хотя
Добавление .groupBy{_._1}
получает это
Map(c -> List((c,2), (c,3)),
a -> List((a,1)),
d -> List((d,3)),
b -> List((b,1), (b,2)))
что ближе. Чтобы превратить эти списки в наборы второй половины пар.
.transform {(k, v)=>v.unzip._2.toSet}
дает
Map(c -> Set(2, 3), a -> Set(1), d -> Set(3), b -> Set(1, 2))
QED:)
(*) YMMV