代码之家  ›  专栏  ›  技术社区  ›  samba

在Spark dataframe中格式化日期会导致意外的格式

  •  0
  • samba  · 技术社区  · 6 年前

    我正在尝试更改 processed_time 我的数据框中的字段。

    最初看起来是这样的: 2017-05-12 11:33:50 -0700 我想把它格式化成 "yyyy-MM-dd HH:mm:ss" (2017-05-12 11:33:50)

    但是,使用下面所示的方法进行格式化后,值在几秒钟后将为零 2017-05-12 11:33:50.0 我想这和时区有关。 怎样才能最终实现零的格式呢?

        .withColumn("processed_time",
                to_utc_timestamp(unix_timestamp(col("processed_time")).cast(TimestampType),
                        "UTC"))
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   norbjd    6 年前

    转换后,列 processed_time 关于你的 DataFrame 属于类型 TimestampType . 因此,列值的类型为 java.sql.Timestamp .

    您看到的尾随零是纳秒数(因为 java.sql.Timestamp时间戳 精确性允许它)。它就在这里因为 your_df.show() ,方法 toString 被召唤 java.sql.Timestamp时间戳 .

    如果您只想格式化结果(但是 String ),您可以添加 .cast(StringType) 当修改您的 处理时间 列:

    df.withColumn(
        "processed_time",
        to_utc_timestamp(
            unix_timestamp(col("processed_time")).cast(TimestampType),
            "UTC"
        ).cast(StringType)
    )
    

    你也可以使用 date_format ,如评论中所述:

    df.withColumn(
        "processed_time",
        date_format(
            to_utc_timestamp(
                unix_timestamp(col("processed_time")).cast(TimestampType),
                "UTC"
            ),
            "yyyy-MM-dd HH:mm:ss"
        )
    )
    

    如果你真的需要 时间戳类型 ,则可以在转换过程中忘记尾随的零,然后使用 SimpleDateFormat 之后展示:

    val firstTimestampFromDf: java.sql.Timestamp = df
        .select("processed_time")
        .head
        .getTimestamp(0)
    
    import java.text.SimpleDateFormat
    
    val simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    val firstTimestampFromDfFormatted = simpleDateFormat.format(firstTimestampFromDf)