На основе строки, указанной в вопросе, и требуемый результат должен быть Array[(Int, Double)]
Входные данные:
import org.apache.spark.sql.SparkSession
val values = List("1:1.10, 2:2.20, 3:3.30")
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._
val df = values.toDF()
Создание UDF:
def parse_values(value: String) = {
val values = value.split(",").map(_.trim)
values.foldLeft(Array[(Int, Double)]()){
case (acc, present) =>
val Array(k, v) = present.split(",")(0).split(":")
acc :+ (k.trim.toInt, v.trim.toDouble)
}
}
val parse_values_udf = udf(parse_values _)
Использование UDF:
df.withColumn("parse_value", parse_values_udf(col("value")))
проверка вывода:
scala> df.withColumn("parse_value", parse_values_udf(col("value"))).show(false)
+----------------------+------------------------------+
|value |parse_value |
+----------------------+------------------------------+
|1:1.10, 2:2.20, 3:3.30|[[1, 1.1], [2, 2.2], [3, 3.3]]|
+----------------------+------------------------------+
scala> df.withColumn("parse_value", parse_values_udf(col("value"))).schema
res22: org.apache.spark.sql.types.StructType = StructType(StructField(value,StringType,true), StructField(parse_value,ArrayType(StructType(StructField(_1,IntegerType,false), StructFi
eld(_2,DoubleType,false)),true),true))