Spark DataFrame String类型列到Timestamp / Date类型列转换

时间:2017-10-11 11:23:30

标签: scala apache-spark apache-spark-sql

我的数据框有两个字符串列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,我会看到日期和时间戳值。

1 个答案:

答案 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")