Пары String to Key-Value в искровом фрейме данных (без Pyspark) - PullRequest
0 голосов
/ 14 июля 2020

Пример: у меня есть столбец со строкой. Мне нужно преобразовать это в кортеж или массив. Основная проблема в том, что мне нужен ключ как целое число, а значение как Double. Массив .

Было бы здорово, если бы кто-нибудь дал мне идею или предложение?

1 Ответ

0 голосов
/ 14 июля 2020

На основе строки, указанной в вопросе, и требуемый результат должен быть 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))
...