PySpark странное поведение to_timestamp () - PullRequest
0 голосов
/ 16 февраля 2019

Я заметил немного странное поведение в функции PySpark (и, возможно, Spark) to_timestamp.Похоже, что он правильно преобразовывает некоторые строки в метку времени, а некоторые другие строки точно такого же формата в null.Рассмотрим следующий пример, который я разработал:

times = [['2030-03-10 02:56:07'], ['2030-03-11 02:56:07']]

df_test = spark.createDataFrame(times, schema=StructType([
    StructField("time_string", StringType())
]))
df_test = df_test.withColumn('timestamp', 
                             F.to_timestamp('time_string', 
                                            format='yyyy-MM-dd HH:mm:ss'))
df_test.show(2, False)

Вот что я получаю:

+-------------------+-------------------+
|time_string        |timestamp          |
+-------------------+-------------------+
|2030-03-10 02:56:07|null               |
|2030-03-11 02:56:07|2030-03-11 02:56:07|
+-------------------+-------------------+

В чем причина того, что вторая строка преобразована правильно, а не первая?Я также пытался использовать функцию unix_timestamp(), и результат тот же.

Еще странно, если я не использую параметр format, я больше не получаю null, кромевремя отметки времени увеличивается на единицу.

df_test2 = df_test.withColumn('timestamp', F.to_timestamp('time_string'))
df_test2.show(2, False)

Результат:

+-------------------+-------------------+
|time_string        |timestamp          |
+-------------------+-------------------+
|2030-03-10 02:56:07|2030-03-10 03:56:07|
|2030-03-11 02:56:07|2030-03-11 02:56:07|
+-------------------+-------------------+

Есть идеи, что происходит?

ОБНОВЛЕНИЕ:

Я пробовал в Scala также через spark-shell, и результат тот же:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions

val times = Seq(Row("2030-03-10 02:56:07"), Row("2030-03-11 02:56:07"))
val schema=List((StructField("time_string", StringType)))
val df = spark.createDataFrame(spark.sparkContext.parallelize(times), 
                               StructType(schema))
val df_test = df.withColumn("timestamp", 
                      functions.to_timestamp(functions.col("time_string"), 
                                             fmt="yyyy-MM-dd HH:mm:ss"))

df_test.show()

И результат:

+-------------------+-------------------+
|        time_string|          timestamp|
+-------------------+-------------------+
|2030-03-10 02:56:07|               null|
|2030-03-11 02:56:07|2030-03-11 02:56:07|
+-------------------+-------------------+
...