sparkDataframe中的字符串到键值对(无pyspark)

qhhrdooz  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(470)

示例:我有一个带字符串的列。我需要把它转换成一个元组或数组。主要的挑战是我需要整数的键和双精度的值。数组<int,double>。
如果有人能给我一个想法或建议就好了?

neskvpey

neskvpey1#

基于问题中提供的字符串,所需的输出需要是 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()

创建自定义项:

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 _)

使用自定义项:

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))

相关问题