Scala — Преобразует столбец с номерами, разделенными запятыми (в настоящее время строка), в массив Double в фрейме данных

#dataframe #scala #apache-spark

#фрейм данных #scala #apache-искра

Вопрос:

У меня есть столбец в фрейме данных, который в настоящее время имеет строковый формат с несколькими разделенными запятыми двойными значениями типа данных (в основном 2 или 3). Обратитесь к приведенному ниже снимку схемы.

 Sample : "619.619620621622, 123.12412512699"  root  |-- MyCol: string (nullable = true)  

Я хочу преобразовать его в массив double, который должен выглядеть как приведенная ниже схема.

 Desired : arraylt;doublegt; [619.619620621622, 123.12412512699]  root  |-- MyCol: array (nullable = true)  | |-- element_value: double (containsNull = true)  

Я знаю, как это сделать с одним строковым значением. Теперь я хочу, чтобы это было в столбце «Полный кадр данных».

Есть ли какой-либо способ сделать это с помощью одинарного/ двойного линейного кода?

Ответ №1:

split cast должен выполнить свою работу:

 import org.apache.spark.sql.functions.{col, split}  val df = Seq(("619.619620621622, 123.12412512699")).toDF("MyCol")  val df2 = df.withColumn("myCol", split(col("MyCol"), ",").cast("arraylt;doublegt;"))  df2.printSchema  //root // |-- myCol: array (nullable = true) // | |-- element: double (containsNull = true)  

Комментарии:

1. Спасибо.. это работает! Я смог понять это вчера … сделал то же самое, что вы упомянули выше.

Ответ №2:

Предполагая отправную точку:

 val spark: SparkSession = ??? import spark.implicits._  val df: DataFrame = ???  

вот решение, основанное на UDF:

 import org.apache.spark.sql.functions._  def toDoubles: UserDefinedFunction =  udf { string: String =gt;  string  .split(",")  .map(_.trim) //based on your input you may need to trim the strings  .map(_.toDouble)  }  df  .select(toDoubles($"MyCol") as "doubles")  

Изменить: toDouble преобразование уже обрезает строку