#scala #apache-spark
#scala #apache-spark
Вопрос:
У меня есть df, в котором есть столбец, представляющий длительность в виде строки типа PT2H
. Я хочу создать новый столбец minutes_int, который можно выполнить в scala с помощью —
import java.time.Duration
Duration.parse('PT2H').toMinutes()
Как я могу сделать это для всего столбца? Я получаю сообщение об ошибке, когда я делаю —
jsonDF.withColumn("minutes_int", Duration.parse(col("duration_str")).toMinutes())
Ошибка —
error: type mismatch;
found : org.apache.spark.sql.Column
required: CharSequence
Как я могу это исправить?
Ответ №1:
Для этого можно использовать определяемую пользователем функцию, хотя следует отметить, что они не оптимизируются, поэтому вам может быть полезно написать свою собственную версию только для Spark.
import java.time.Duration
import org.apache.spark.sql.functions.udf
def durationToMinutes(duration:String) = Duration.parse(duration).toMinutes()
val durationToMinutesUDF = udf(durationToMinutes _)
А затем использовать его…
jsonDF.withColumn("minutes_int", durationToMinutesUDF(col("duration_str")))
Обратите внимание, что вы также можете зарегистрировать это, чтобы использовать его в SQL, т.Е.
spark.udf.register("duration_to_minutes",durationToMinutesUDF)
jsonDF.registerTempTable("json_df")
spark.sql("select duration_to_minutes(duration_str) from json_df")