2017-10-11 621 views
1

嗨我有两个字符串列c1dt和c2tm的数据帧,它的格式分别是yyyymmdd和yyyymmddTHHmmss.SSSz。现在我想将这些列转换为日期类型和时间戳类型列,我尝试了以下操作,但它不起作用,它将列值显示为空值。Spark DataFrame字符串类型列到时间戳/日期类型列转换

val newdf = df.withColumn("c1dt", unix_timestmap("c1dt","yyyymmdd").cast("date").withColumn("c2tm","yyyymmddTHHmmss.SSSz").cast("timestamp")) 

当我调用newdf.show时,两列的值都显示为空。如果我打印原始数据框df,我会看到日期和时间戳值,请指导。提前致谢。

回答

-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") 
相关问题