我的数据框有两个字符串列c1dt和c2tm,它的格式分别是yyyymmdd和yyyymmddTHHmmss.SSSz。现在我想将这些列转换为日期类型和时间戳类型列,我尝试了以下但是它不起作用它将列值显示为null。
val newdf = df.withColumn("c1dt", unix_timestmap("c1dt","yyyymmdd").cast("date").withColumn("c2tm","yyyymmddTHHmmss.SSSz").cast("timestamp"))
当我调用newdf.show时,两个列的值都显示为null。如果我打印原始数据帧df,我会看到日期和时间戳值。
答案 0 :(得分:-1)
由于您的时间戳格式不是默认格式,因此您最好的选择可能是创建一个udf。
def _stringToTs(s: String): Timestamp = {
val format = new SimpleDateFormat("yyyymmddTHHmmss.SSSz")
val date = format.parse(timestamp)
new Timestamp(miliseconds);
}
import org.apache.spark.sql.functions.udf
val stringToTS = udf(_stringToTS)
val newdf = df.withColumn("c1dt", stringToTS($"c1dt").cast("date").withColumn("c2tm",stringToTS($"c2tm")))
如果您的数据来自CSV,您可以在加载数据之前指定时间戳格式,这将更快整体
spark.read
.format("csv")
.option("inferSchema", "true") // Automatically infer data types
.option("timestampFormat", "yyyymmddTHHmmss.SSSz")
.load("path")