For udf
,我还不太确定为什么它不起作用。将Python函数转换为UDF时可能存在浮点操作问题。请参阅下面如何使用整数输出。或者,您可以使用名为的 Spark 函数进行解析unix_timestamp
这允许您转换时间戳。我在下面举一个例子。希望它能有所帮助。
在这里,我根据您展示的示例创建 Spark 数据框,
import pandas as pd
df = pd.DataFrame([
['2017-05-31 15:30:48.000', '2017-05-31 11:30:00.000', 0],
['2017-05-31 15:31:45.000', '2017-05-31 11:30:00.000', 0],
['2017-05-31 15:32:49.000', '2017-05-31 11:30:00.000', 0]],
columns=['timestamp', 'adj_timestamp', 'values'])
df = spark.createDataFrame(df)
使用Spark函数求解
Apply fn.unix_timestamp
到专栏timestamp
import pyspark.sql.functions as fn
from pyspark.sql.types import *
df.select(fn.unix_timestamp(fn.col('timestamp'), format='yyyy-MM-dd HH:mm:ss.000').alias('unix_timestamp')).show()
对于第一列,输出如下所示
+--------------+
|unix_timestamp|
+--------------+
| 1496259048|
| 1496259105|
| 1496259169|
+--------------+
您可以使用将其放回时间戳datetime
图书馆:
import datetime
datetime.datetime.fromtimestamp(1496259048) # output as datetime(2017, 5, 31, 15, 30, 48)
通过转换为整数而不是浮点数来解决
import datetime
import time
def timeConverter(timestamp):
time_tuple = datetime.datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S.000").timetuple()
timevalue = int(time.mktime(time_tuple)) # convert to int here
return timevalue
time_udf = fn.udf(timeConverter, IntegerType()) # output interger
df.select(time_udf(fn.col('timestamp')))
在这里,我们将得到相同的时间戳[1496259048, 1496259105, 1496259169]
作为使用unix_timestamp
.