关于在pyspark中使用cast函数来处理时间信息

hfsqlsce  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(413)

有一个如下所示的Dataframe,它有两列。

df.show()
|                Time|             MinTime|
|2019-11-19 23:00:...|2019-11-19 23:00:...|
|2019-11-19 23:15:...|2019-11-19 23:00:...|
|2019-11-19 23:30:...|2019-11-19 23:00:...|

root
 |-- Time: string (nullable = true)
 |-- MinTime: string (nullable = true)

df.show(truncate=False)
|                Time|             MinTime|
|2019-11-19 23:00:000000|2019-11-19 23:00:000000|
|2019-11-19 23:15:000000|2019-11-19 23:00:000000|
|2019-11-19 23:30:000000|2019-11-19 23:00:000000|

在我使用下面的代码行来处理上面的列之后,列的值 Offset 都是空的。基于中的值 Time 以及 MinTime ,所有行的差异不应为空。我可以知道原因吗?

df= df.withColumn('Offset',((col('Time').cast('long') - col('MinTime').cast('long'))))
df.show()
|                Time|             MinTime|         Offset|
|2019-11-19 23:00:...|2019-11-19 23:00:...|           null|
|2019-11-19 23:15:...|2019-11-19 23:00:...|           null|
|2019-11-19 23:30:...|2019-11-19 23:00:...|           null|

df.printSchema()
root
 |-- Time: string (nullable = true)
 |-- MinTime: string (nullable = true)
 |-- Offset: long (nullable = true)

df.show(truncate=False)
|                Time|                  MinTime|          Offset|
|2019-11-19 23:00:000000|2019-11-19 23:00:000000|           null|
|2019-11-19 23:15:000000|2019-11-19 23:00:000000|           null|
|2019-11-19 23:30:000000|2019-11-19 23:00:000000|           null|
g6baxovj

g6baxovj1#

请检查你的计划 df ,如果列类型为 String 它必须转换成 timestamp 第一
你可以用 to_timestamp 函数将数据类型转换为 timestamp 第一个as

date_format = 'yyyy-MM-dd HH:mm:ss'

df.withColumn('Offset',
              (f.to_timestamp('Time', date_format).cast('long') - f.to_timestamp('MinTime').cast('long'))) \
    .show(truncate=False)

结果:

+-------------------+-------------------+------+
|Time               |MinTime            |Offset|
+-------------------+-------------------+------+
|2019-11-19 23:00:00|2019-11-19 23:00:00|0     |
|2019-11-19 23:15:00|2019-11-19 23:00:00|900   |
|2019-11-19 23:30:00|2019-11-19 23:00:00|1800  |
+-------------------+-------------------+------+

请确保使用正确的日期格式。

相关问题