pyspark:从时间戳中删除微秒
pyspark: removing mirosecond from timestamp
我正在编写 pyspark 脚本,其中一项必需的转换是将微秒时间戳转换为秒时间戳 -
读取 parquet 文件作为输入
确定是否有任何列为"timestamp"。(将以微秒为单位)
Example - 2019-03-30 19:56:14.520138
如果是,将其转换为'yyyy-mm-dd hh:mm:ss'格式
After conversion - 2019-03-30 19:56:14
将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。
希望对您有所帮助
我正在编写 pyspark 脚本,其中一项必需的转换是将微秒时间戳转换为秒时间戳 -
读取 parquet 文件作为输入
确定是否有任何列为"timestamp"。(将以微秒为单位)
Example - 2019-03-30 19:56:14.520138
如果是,将其转换为'yyyy-mm-dd hh:mm:ss'格式
After conversion - 2019-03-30 19:56:14
将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。
希望对您有所帮助