Вы можете преобразовать DataFrame, используя split
, explode
и groupBy/pivot/agg
, следующим образом:
val df = Seq(
(1, "col1,val11|col3,val31"),
(2, "col3,val33|col1,val13"),
(3, "col2,val22")
).toDF("id", "allvals")
import org.apache.spark.sql.functions._
df.withColumn("temp", split($"allvals", "\\|")).
withColumn("temp", explode($"temp")).
withColumn("temp", split($"temp", ",")).
select($"id", $"allvals", $"temp".getItem(0).as("k"), $"temp".getItem(1).as("v")).
groupBy($"id", $"allvals").pivot("k").agg(first($"v"))
// +---+---------------------+-----+-----+-----+
// |id |allvals |col1 |col2 |col3 |
// +---+---------------------+-----+-----+-----+
// |1 |col1,val11|col3,val31|val11|null |val31|
// |3 |col2,val22 |null |val22|null |
// |2 |col3,val33|col1,val13|val13|null |val33|
// +---+---------------------+-----+-----+-----+