Предположим, у вас был следующий фрейм данных:
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
поддерживает только вторую точность . Если вас интересует только сортировка по дате, вы можете сделать следующее:
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|
#+--------------------------+-------------------+