gpt4 book ai didi

scala - Spark Scala : How to transform a column in a DF

转载 作者:行者123 更新时间:2023-12-03 10:38:01 25 4
gpt4 key购买 nike

我在 Spark 中有一个数据框,其中包含许多列和我定义的 udf。我想要相同的数据框,除了转换一列。此外,我的 udf 接受一个字符串并返回一个时间戳。是否有捷径可寻?我试过

val test = myDF.select("my_column").rdd.map(r => getTimestamp(r)) 

但这会返回一个 RDD 并且仅包含转换后的列。

最佳答案

如果您确实需要使用您的功能,我可以建议两个选项:

1)使用 map /toDF:

import org.apache.spark.sql.Row
import sqlContext.implicits._

def getTimestamp: (String => java.sql.Timestamp) = // your function here

val test = myDF.select("my_column").rdd.map {
case Row(string_val: String) => (string_val, getTimestamp(string_val))
}.toDF("my_column", "new_column")

2) 使用 UDF ( UserDefinedFunction ):
import org.apache.spark.sql.functions._

def getTimestamp: (String => java.sql.Timestamp) = // your function here

val newCol = udf(getTimestamp).apply(col("my_column")) // creates the new column
val test = myDF.withColumn("new_column", newCol) // adds the new column to original DF

this nice article by Bill Chambers 中有关于 Spark SQL UDF 的更多详细信息.

或者 ,

如果你只是想转换一个 StringType列成 TimestampType您可以使用 unix_timestampcolumn function自 Spark SQL 1.5 起可用:
val test = myDF
.withColumn("new_column", unix_timestamp(col("my_column"), "yyyy-MM-dd HH:mm").cast("timestamp"))

注意:对于spark 1.5.x,需要乘以 unix_timestamp的结果来自 1000在转换为时间戳之前(问题 SPARK-11724)。结果代码将是:
val test = myDF
.withColumn("new_column", (unix_timestamp(col("my_column"), "yyyy-MM-dd HH:mm") *1000L).cast("timestamp"))

编辑:添加 udf 选项

关于scala - Spark Scala : How to transform a column in a DF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37039943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com