Вот еще один простой пример:
val ds = sc.parallelize(Seq((0, "Lorem ipsum dolor", 1.0, Array("prp1", "prp2", "prp3"))))
Альтернативный способ взрыва массивов с помощью flatMaps.
ds.flatMap { t =>
t._4.map { prp =>
(t._1, t._2, t._3, prp) }}.collect.foreach(println)
Результат:
(0,Lorem ipsum dolor,1.0,prp1)
(0,Lorem ipsum dolor,1.0,prp2)
(0,Lorem ipsum dolor,1.0,prp3)
Пробовал с вашим набором данных, но не уверен, что это оптимальный способ сделать это.
df1.show(false)
+---+---+------------------------------------------------+
|A |B |C |
+---+---+------------------------------------------------+
|a |1 |[[a, b, c, 0], [a1, b1, c1, 1], [a2, b2, c2, 2]]|
|b |2 |[[a, b, c, 0]] |
+---+---+------------------------------------------------+
df1.rdd.flatMap { t:Row => t.getSeq(2).map { row: Row => (t.getString(0),t.getString(1),row)}}
.map {
case (col1: String,col2: String, col3: Row) => (col1, col2,col3.getString(0),col3.getString(1),col3.getString(2),col3.getInt(3))
}.collect.foreach(println)
Результат:
(a,1,a,b,c,0)
(a,1,a1,b1,c1,1)
(a,1,a2,b2,c2,2)
(b,2,a,b,c,0)
Надеюсь, это поможет!