Создание столбца массива с использованием другого столбца массива в кадре данных Spark (Scala) - PullRequest
0 голосов
/ 28 января 2020

Я новичок и в Scala, и в Spark. Я пытаюсь преобразовать входные данные, считанные из файлов, как Double в Float (что безопасно в этом приложении), чтобы уменьшить использование памяти. Я смог сделать это с помощью столбца Double.

Текущий подход для одного элемента:

import org.apache.spark.sql.functions.{col, udf}
val tcast = udf((s: Double) => s.toFloat)

val myDF = Seq(
   (1.0, Array(0.1, 2.1, 1.2)),
   (8.0, Array(1.1, 2.1, 3.2)),
   (9.0, Array(1.1, 1.1, 2.2))
).toDF("time", "crds")

myDF.withColumn("timeF", tcast(col("time"))).drop("time").withColumnRenamed("timeF", "time").show
myDF.withColumn("timeF", tcast(col("time"))).drop("time").withColumnRenamed("timeF", "time").schema

Но в настоящее время застрял с преобразованием массива двойных чисел в числа с плавающей точкой. Любая помощь будет оценена.

1 Ответ

1 голос
/ 28 января 2020

Вы можете использовать selectExpr, например:

val myDF = Seq(
   (1.0, Array(0.1, 2.1, 1.2)),
   (8.0, Array(1.1, 2.1, 3.2)),
   (9.0, Array(1.1, 1.1, 2.2))
).toDF("time", "crds")

myDF.printSchema()

// output:
root
 |-- time: double (nullable = false)
 |-- crds: array (nullable = true)
 |    |-- element: double (containsNull = false)

val df = myDF.selectExpr("cast(time as float) time", "cast(crds as array<float>) as crds")
df.show()

+----+---------------+
|time|           crds|
+----+---------------+
| 1.0|[0.1, 2.1, 1.2]|
| 8.0|[1.1, 2.1, 3.2]|
| 9.0|[1.1, 1.1, 2.2]|
+----+---------------+

df.printSchema()

root
 |-- time: float (nullable = false)
 |-- crds: array (nullable = true)
 |    |-- element: float (containsNull = true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...