【问题标题】:Convert Timestamp value to Double value in Scala在Scala中将时间戳值转换为双精度值
【发布时间】:2021-12-12 23:42:00
【问题描述】:

所以我已经更改了 TimeStamp 的“t”,我必须将其转换为 Double。我定义了这个类:

case class RawData(sessionId: String,
                   t: Double,
                   channel: Int,
                   signalName: String,
                   physicalValue: Double,
                   messageId: Long,
                   vehicleId: String)

我在这段代码中将“t”转换为双精度时遇到问题:

def raw(): Unit = {
    import rawData.sqlContext.implicits._
//TODO solve timestamp
    val datDMY = rawData
      .map(row => {
        cal.setTimeInMillis(row.t.)
        RawDataExtended(
          row.sessionId,
          row.t,
          row.channel,
          row.signalName,
          row.physicalValue,
          row.messageId,
          cal.get(Calendar.YEAR),
          cal.get(Calendar.MONTH) + 1,
          cal.get(Calendar.DAY_OF_MONTH)
        )
      })

【问题讨论】:

    标签: scala dataframe timestamp double


    【解决方案1】:

    也许这可以帮助你:

      case class InputModel(id: Int, time: Timestamp)
      case class Foo(id: Int, timeLong: Long, timeDouble: Double)
    
      val xs = Seq((1, Timestamp.from(Instant.now())), (2, Timestamp.from(Instant.now()))).toDF("id", "time")
    
      val ys = xs
        .select('id, 'time cast (DataTypes.LongType) as "timeLong", 'time cast (DataTypes.DoubleType) as "timeDouble")
        .as[Foo]
    
      val zs = xs
        .as[InputModel]
        .map(row => {
          Foo(row.id, row.time.getTime.toLong, row.time.getTime.toDouble)
        })
    
      xs.show(false)
      ys.show(false)
      zs.show(false)
    

    虽然在转换为 Double 时要小心时区并且要精确 - 请注意时间戳与 Double 相比它是如何表示为 Long 的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 2019-02-24
      • 1970-01-01
      • 2011-01-14
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多