Прежде чем я начну, вопрос о формате времени. Почему значение миллисекунды - 86754? это будет означать 86 секунд и 754 миллисекунды? вы имеете в виду микросекунды? тогда это имеет смысл.
Во всяком случае, я попытался с тем же форматом даты, чтобы проверить, может ли искра справиться с этим, и он это делает.
Рассмотрим тестовый фрейм данных
import pyspark.sql.functions as F
test_df= sqlContext.createDataFrame(["2020-01-20 07:41:21.86754","2020-01-20 07:41:21.86999"],"string").toDF('date')
test_df.show(truncate=False)
+-------------------------+
|date |
+-------------------------+
|2020-01-20 07:41:21.86754|
|2020-01-20 07:41:21.86999|
+-------------------------+
test_res = test_df.withColumn("timestamp",F.to_timestamp(F.col('date')))
test_res.show(truncate=False)
+-------------------------+-------------------------+
|date |timestamp |
+-------------------------+-------------------------+
|2020-01-20 07:41:21.86754|2020-01-20 07:41:21.86754|
|2020-01-20 07:41:21.86999|2020-01-20 07:41:21.86999|
+-------------------------+-------------------------+
Как видите, при преобразовании вашей строки в отметку времени нет ошибки. Я использовал это со искрой 2.4.0. Проверьте dtypes результата
test_res.dtypes
[('date', 'string'), ('timestamp', 'timestamp')]
Я все еще заинтригован твоим намерением. Когда вам нужно обработать метку времени, скажем, преобразовав ее в unix_timestamp, вы получите одно и то же значение для двух строк, даже если миллисекунды (или микросекунды в вашем случае) разные
test_res1=test_res.withColumn("unix_time",F.unix_timestamp('date'))
test_res1.show(truncate=False)
+-------------------------+-------------------------+----------+
|date |timestamp |unix_time |
+-------------------------+-------------------------+----------+
|2020-01-20 07:41:21.86754|2020-01-20 07:41:21.86754|1579502481|
|2020-01-20 07:41:21.86999|2020-01-20 07:41:21.86999|1579502481|
+-------------------------+-------------------------+----------+
То же самое происходит, когда вы пытаетесь преобразовать метку времени в int.
test_longint = test_res1.withColumn("test_int",F.col('timestamp').cast('int'))
test_longint.show()
+--------------------+--------------------+----------+----------+
| date| timestamp| unix_time| test_int|
+--------------------+--------------------+----------+----------+
|2020-01-20 07:41:...|2020-01-20 07:41:...|1579502481|1579502481|
|2020-01-20 07:41:...|2020-01-20 07:41:...|1579502481|1579502481|
+--------------------+--------------------+----------+----------+
Надеюсь это поможет. Я могу объяснить больше, если я знаю больше о том, что вам нужно.
person
Raghu
schedule
22.06.2020