首页 文章

Spark DataFrame字符串类型列到Timestamp / Date类型列转换

提问于
浏览
2

我有两个字符串列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 回答

  • -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")
    

相关问题