我在pySpark数据框中有一列date
,其日期采用以下格式:
2018-02-01T13:13:12.023507
我想将该列中的日期从字符串转换为时间戳(或者可以根据日期对它进行排序的东西)。到目前为止,我已经尝试了以下方法:
new_df = df.withColumn(
'date',
unix_timestamp("date", "YYYY-MM-DD'T'hh:mm:ss.s").cast("double").cast("timestamp")
)
还有这个
new_df = df.withColumn(
'date',
from_unixtime(
unix_timestamp(col(('date')), "yyyy-MM-dd'T'hh:mm:ss.SSS"),
"yyyy-MM-dd'T'HH:mm:ss.SSS"
)
)
还有这个
df_new = df.withColumn(
'date1',
F.to_timestamp("date", "yyyy-dd-MM'T'hh:mm:ss.s")
)
我尝试了在其他类似问题中发现的所有问题,但到目前为止没有任何效果。我还尝试了另一种格式yyyy-MM-dd'T'HH:mm:ss.ssssss
,但没有成功。我想念什么?
答案 0 :(得分:1)
假设您具有以下DataFrame:
df = spark.createDataFrame(
[('2018-02-01T13:13:12.023507', ), ('2018-02-01T13:13:12.323507', )],
["date"]
)
df.show(truncate=False)
#+--------------------------+
#|date |
#+--------------------------+
#|2018-02-01T13:13:12.023507|
#|2018-02-01T13:13:12.323507|
#+--------------------------+
Java的SimpleDateFormat
only supports second precision。如果只考虑基于日期的排序,则可以执行以下操作:
from pyspark.sql.functions import col, unix_timestamp
df.withColumn(
'new_date',
unix_timestamp(col('date'), "yyyy-MM-dd'T'hh:mm:ss").cast("timestamp")
).sort('new_date').show(truncate=False)
#+--------------------------+---------------------+
#|date |new_date |
#+--------------------------+---------------------+
#|2018-02-01T13:13:12.323507|2018-02-01 13:13:12.0|
#|2018-02-01T13:13:12.023507|2018-02-01 13:13:12.0|
#+--------------------------+---------------------+
但是由于这两行示例的日期和时间直到第二行都相同,因此此处的排序将不确定。
如果第二部分对您很重要,则可以编写自己的函数来处理。一种方法是将date
上的.
列除以1000000.0
除以得到微秒。然后将其添加到unixtimestamp
进行排序:
from pyspark.sql.functions import split
df.withColumn(
'order_column',
unix_timestamp('date', "yyyy-MM-dd'T'hh:mm:ss") + split('date', "\.")[1]/1000000.0
).sort("order_column").show(truncate=False)
#+--------------------------+-------------------+
#|date |order_column |
#+--------------------------+-------------------+
#|2018-02-01T13:13:12.023507|1.517508792023507E9|
#|2018-02-01T13:13:12.323507|1.517508792323507E9|
#+--------------------------+-------------------+
答案 1 :(得分:0)
您可以尝试如下所示的udf。
format = '%Y-%m-%d %H:%M:%S:%s' func = udf (lambda x: datetime.strptime(x, format), TimestampType())
答案 2 :(得分:0)
对于Spark> = 2.2,unix_timestamp()
的另一种方法是使用to_timestamp()
:
from pyspark.sql.functions import col, to_timestamp
new_df = df.withColumn('converted_date',to_timestamp(col('date'), "yyyy-MM-dd'T'HH:mm:ss"))