복붙노트

[SCALA] 어떻게 스칼라를 사용하여 스파크 2.1 밀리 초와 타임 스탬프에 밀리 세컨드의 문자열 열을 변환하는?

SCALA

어떻게 스칼라를 사용하여 스파크 2.1 밀리 초와 타임 스탬프에 밀리 세컨드의 문자열 열을 변환하는?

나는 스칼라와 스파크 2.1을 사용하고 있습니다.

어떻게 밀리 초와 타임 스탬프에 밀리 세컨드의 문자열 열을 변환하는?

나는 불꽃의 타임 스탬프로 문자열 필드를 변환 할 질문 더 나은 방법에서 다음 코드를 시도

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

하지만 밀리없이 결과를 얻을 :

+---+-----------------------+---------------------+
|id |dts                    |ts                   |
+---+-----------------------+---------------------+
|1  |05/26/2016 01:01:01.601|2016-05-26 01:01:01.0|
|2  |#$@#@#                 |null                 |
+---+-----------------------+---------------------+

해결법

  1. ==============================

    1.SimpleDateFormat에와 UDF 작동합니다. 아이디어는 UDF 논리에 램 Ghadiyaram의 링크에서 가져옵니다.

    SimpleDateFormat에와 UDF 작동합니다. 아이디어는 UDF 논리에 램 Ghadiyaram의 링크에서 가져옵니다.

    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, "#$@#@#")).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  |#$@#@#                 |null                   |
    +---+-----------------------+-----------------------+
    
  2. ==============================

    2.UDF를 만드는 것보다 더 쉬운 방법이있다. 그냥 밀리 초 데이터를 분석하고 (다음 코드 pyspark 작동하며 매우 가까운 스칼라 동일해야) 유닉스 타임 스탬프에 추가 :

    UDF를 만드는 것보다 더 쉬운 방법이있다. 그냥 밀리 초 데이터를 분석하고 (다음 코드 pyspark 작동하며 매우 가까운 스칼라 동일해야) 유닉스 타임 스탬프에 추가 :

    timeFmt = "yyyy/MM/dd HH:mm:ss.SSS"
    df = df.withColumn('ux_t', unix_timestamp(df.t, format=timeFmt) + substring(df.t, -3, 3).cast('float')/1000)
    

    결과: '2017년 3월 5일 14 : 02 : 41.865'는 1488722561.865로 변환된다

  3. from https://stackoverflow.com/questions/44886772/how-to-convert-a-string-column-with-milliseconds-to-a-timestamp-with-millisecond by cc-by-sa and MIT license