2017-07-03 36 views
1

私はScala 2.1でScalaを使用しています。Scalaを使用してミリ秒の文字列をミリ秒単位のタイムスタンプに変換する方法は?

ミリ秒の文字列をミリ秒のタイムスタンプに変換するにはどうすればよいですか?

私は質問Better way to convert a string field into timestamp in Spark

import org.apache.spark.sql.functions.unix_timestamp 
val tdf = Seq((1L, "05/26/2016 01:01:01.601"), (2L, "#[email protected]#@#")).toDF("id", "dts") 
val tts = unix_timestamp($"dts", "MM/dd/yyyy HH:mm:ss.SSS").cast("timestamp") 
tdf.withColumn("ts", tts).show(2, false) 

から次のコードを試してみましたしかし、私はミリ秒単位なしで結果を得る:のSimpleDateFormatと

+---+-----------------------+---------------------+ 
|id |dts     |ts     | 
+---+-----------------------+---------------------+ 
|1 |05/26/2016 01:01:01.601|2016-05-26 01:01:01.0| 
|2 |#[email protected]#@#     |null     | 
+---+-----------------------+---------------------+ 

答えて

3

UDF動作します。この考えは、Ram GhadiyaramのUDF logicへのリンクから取られます。出力と

import java.text.SimpleDateFormat 
import java.sql.Timestamp 
import org.apache.spark.sql.functions.udf 
import scala.util.{Try, Success, Failure} 

val getTimestamp: (String => Option[Timestamp]) = s => s match { 
    case "" => None 
    case _ => { 
    val format = new SimpleDateFormat("MM/dd/yyyy' 'HH:mm:ss.SSS") 
    Try(new Timestamp(format.parse(s).getTime)) match { 
     case Success(t) => Some(t) 
     case Failure(_) => None 
    }  
    } 
} 

val getTimestampUDF = udf(getTimestamp) 
val tdf = Seq((1L, "05/26/2016 01:01:01.601"), (2L, "#[email protected]#@#")).toDF("id", "dts") 
val tts = getTimestampUDF($"dts") 
tdf.withColumn("ts", tts).show(2, false) 

+---+-----------------------+-----------------------+ 
|id |dts     |ts      | 
+---+-----------------------+-----------------------+ 
|1 |05/26/2016 01:01:01.601|2016-05-26 01:01:01.601| 
|2 |#[email protected]#@#     |null     | 
+---+-----------------------+-----------------------+ 
+0

素晴らしいです!残念ながら私はsparkのテストenvtを持っていない:-) –

関連する問題