pyspark:从时间戳中删除微秒

pyspark: removing mirosecond from timestamp

我正在编写 pyspark 脚本,其中一项必需的转换是将微秒时间戳转换为秒时间戳 -

  1. 读取 parquet 文件作为输入

  2. 确定是否有任何列为"timestamp"。(将以微秒为单位)

    Example - 2019-03-30 19:56:14.520138
    
  3. 如果是,将其转换为'yyyy-mm-dd hh:mm:ss'格式

    After conversion - 2019-03-30 19:56:14
    
  4. 将parquet格式的dataframe写回s3。

我已经尝试过,下面的但是它不起作用。返回的数据帧仍然显示微秒。

df = spark.read.parquet(p_input_loc)

def customize_df(df):
    getTimestampCol = list(
                filter(lambda x: "timestamp" in x, df.dtypes))
    print(getTimestampCol)
    """[('created_at', 'timestamp'), ('updated_at', 'timestamp')]"""
    if getTimestampCol:
        for row in getTimestampCol:
            df = df.withColumn(row[0], f.to_timestamp(row[0], 'yyyy-mm-dd hh:mm:ss'))
        return df
    else:
        return df

所以我需要帮助!!

问题出在您的函数使用上。 to_timestamp 函数以提供的格式解析日期,然后将其转换为时间戳,但要更改格式,您需要使用 date_format 函数。

这是一个例子

df2 = spark.createDataFrame([("2020-01-01 11:22:59.9989","12312020","31122020"), ("2020-01-01 11:22:59.9989","12312020","31122020" )], ["ID","Start_date","End_date"])

df2.withColumn('ss',f.date_format(df2.ID.cast(t.TimestampType()),'yyyy-MM-dd HH:mm:ss')).select('ss','ID').show(2, False)

+-------------------+------------------------+
|ss                 |ID                      |
+-------------------+------------------------+
|2020-01-01 11:22:59|2020-01-01 11:22:59.9989|
|2020-01-01 11:22:59|2020-01-01 11:22:59.9989|
+-------------------+------------------------+

所以改变你的

df = df.withColumn(row[0], f.to_timestamp(row[0], 'yyyy-mm-dd hh:mm:ss'))

df = df.withColumn(row[0], f.date_format(row[0], 'yyyy-MM-dd HH:mm:ss'))

因为您的列已经是 timestampType。

希望对您有所帮助