Can unix_timestamp() return unix time in milliseconds in Apache Spark?

前端 未结 4 1662
情深已故
情深已故 2021-02-12 20:17

I\'m trying to get the unix time from a timestamp field in milliseconds (13 digits) but currently it returns in seconds (10 digits).

scala> var df = Seq(\"20         


        
4条回答
  •  故里飘歌
    2021-02-12 21:06

    Up to Spark version 3.0.1 it is not possible to convert a timestamp into unix time in milliseconds using the SQL built-in function unix_timestamp.

    According to the code on Spark's DateTimeUtils

    "Timestamps are exposed externally as java.sql.Timestamp and are stored internally as longs, which are capable of storing timestamps with microsecond precision."

    Therefore, if you define a UDF that has a java.sql.Timestamp as input you can call getTime for a Long in millisecond. If you apply unix_timestamp you will only get unix time with precision in seconds.

    val tsConversionToLongUdf = udf((ts: java.sql.Timestamp) => ts.getTime)
    

    Applying this to a variety of Timestamps:

    val df = Seq("2017-01-18 11:00:00.000", "2017-01-18 11:00:00.111", "2017-01-18 11:00:00.110", "2017-01-18 11:00:00.100")
      .toDF("timestampString")
      .withColumn("timestamp", to_timestamp(col("timestampString")))
      .withColumn("timestampConversionToLong", tsConversionToLongUdf(col("timestamp")))
      .withColumn("timestampUnixTimestamp", unix_timestamp(col("timestamp")))
    
    df.printSchema()
    df.show(false)
    
    // returns
    root
     |-- timestampString: string (nullable = true)
     |-- timestamp: timestamp (nullable = true)
     |-- timestampConversionToLong: long (nullable = false)
     |-- timestampCastAsLong: long (nullable = true)
    
    +-----------------------+-----------------------+-------------------------+-------------------+
    |timestampString        |timestamp              |timestampConversionToLong|timestampUnixTimestamp|
    +-----------------------+-----------------------+-------------------------+-------------------+
    |2017-01-18 11:00:00.000|2017-01-18 11:00:00    |1484733600000            |1484733600         |
    |2017-01-18 11:00:00.111|2017-01-18 11:00:00.111|1484733600111            |1484733600         |
    |2017-01-18 11:00:00.110|2017-01-18 11:00:00.11 |1484733600110            |1484733600         |
    |2017-01-18 11:00:00.100|2017-01-18 11:00:00.1  |1484733600100            |1484733600         |
    +-----------------------+-----------------------+-------------------------+-------------------+
    

提交回复
热议问题