将函数应用于PySpark dataframe中的列

将函数应用于PySpark dataframe中的列,dataframe,pyspark,Dataframe,Pyspark,我是Spark的新手,具体来说是PySpark。我有一个看起来像 col_1 | col_2 | col_3 apple | red | 2016-01-28 00:56:55 banana | yellow | 2011-01-14 10:26:33.231 我有一个函数convert(),它将日期时间字符串(如2016-01-28 00:56:55(可能有毫秒,也可能没有毫秒)转换为表示UNIX时间的浮点数,如1453971415。PySpark如何将此函数应用于我的col\u

我是Spark的新手,具体来说是PySpark。我有一个看起来像

col_1  | col_2  | col_3
apple  | red    | 2016-01-28 00:56:55
banana | yellow | 2011-01-14 10:26:33.231

我有一个函数
convert()
,它将日期时间字符串(如
2016-01-28 00:56:55
(可能有毫秒,也可能没有毫秒)转换为表示UNIX时间的浮点数,如
1453971415
。PySpark如何将此函数应用于我的
col\u 3
,因此
col\u 3
中的所有时间戳都是unix时间?

您可以使用
from\u unixtime
将字符串转换为时间戳,然后
转换(“long”)
来获取
unix时间戳

如果所有的时间戳都以毫秒结束,则可以直接使用
“yyyy-MM-dd HH:MM:ss.SSS”
格式进行转换:

from pyspark.sql.functions import *

df.withColumn('col_3', from_unixtime(unix_timestamp('col_3', 'yyyy-MM-dd HH:mm:ss.SSS'))\
                .cast("timestamp")).withColumn('col_3', col('col_3').cast("long")).show()
但是,如果时间戳有毫秒和没有毫秒,可以使用子字符串将它们转换为
“yyyy-MM-dd HH:MM:ss”
格式

df.withColumn('col_3', from_unixtime(unix_timestamp(substring(col("col_3"),0,19), 'yyyy-MM-dd HH:mm:ss'))\
                .cast("timestamp")).withColumn('col_3', col('col_3').cast("long")).show()

+------+------+----------+                                                      
| col_1| col_2|     col_3|
+------+------+----------+
| apple|   red|1453960615|
|banana|yellow|1295018793|
+------+------+----------+

毫秒可以去掉,因为它们不会影响Unix时间戳。

看起来很干净!!不幸的是,它对我的数据不起作用,因为一些时间戳也有毫秒部分。我更新了我的问题,更新了我的答案<代码>'yyyy-MM-dd HH:MM:ss.SSS'如果有毫秒,则可以使用。