#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
преобразование уже обрезает строку