Почему `unix_timestamp` ведет себя по-разному в Spark 2.3.x / 2.0.x? - PullRequest
1 голос
/ 30 мая 2019

Попытка сделать простое преобразование с использованием unix_timestamp ведет себя иначе, чем Spark 2.0.2 и 2.3.x.

Сначала я думал, что это может быть проблема, связанная со средой Spark, например, разница часовых поясов. Но все настройки одинаковы.

Пример ниже показывает описанное поведение.


import org.apache.spark.sql.types.{TimestampType}


case class Dummy(mts:String, sts:String)

val testData = Seq(Dummy("2018-05-09-06.57.53.013768", "2018-05-09-06.57.53.013198"), Dummy("2018-11-21-04.30.03.804441", "2018-11-21-04.30.03.802212")).toDF

val result = testData
      .withColumn("time1", unix_timestamp(col("sts"), "yyyy-MM-dd-HH.mm.ss.SSSSSS").cast(TimestampType))
      .withColumn("time2", unix_timestamp(col("sts"), "yyyy-MM-dd-HH.mm.ss.SSSSSS").cast(TimestampType))


result.select($"time1", $"time2", $"sts", $"mts").show(false)

scala> spark.version
res25: String = 2.3.1.3.0.1.0-187

scala> result.select("time1", "time2", "sts", "mts").show(false)
+-----+-----+--------------------------+--------------------------+
|time1|time2|sts                      |mts                      |
+-----+-----+--------------------------+--------------------------+
|null |null |2018-05-09-06.57.53.013198|2018-05-09-06.57.53.013768|
|null |null |2018-11-21-04.30.03.802212|2018-11-21-04.30.03.804441|
+-----+-----+--------------------------+--------------------------+

scala>

scala> spark.version
   def version: String

scala> spark.version
res4: String = 2.0.2

scala> result.select("time1", "time2", "sts", "mts").show(false)
+---------------------+---------------------+--------------------------+--------------------------+
|time1                |time2                |sts                      |mts                      |
+---------------------+---------------------+--------------------------+--------------------------+
|2018-05-09 06:58:06.0|2018-05-09 06:58:06.0|2018-05-09-06.57.53.013198|2018-05-09-06.57.53.013768|
|2018-11-21 04:43:25.0|2018-11-21 04:43:27.0|2018-11-21-04.30.03.802212|2018-11-21-04.30.03.804441|
+---------------------+---------------------+--------------------------+--------------------------+

Есть ли какая-то особая причина для такого поведения?

1 Ответ

1 голос
/ 30 мая 2019

Ваша проблема связана с функцией unix_timestamp.

Преобразует строку в метку времени Unix в секундах. Так что все, что после секунд игнорируется. Spark 2.0.2 был довольно прощающим и заменил часть SSSSSS вашего паттерна на 0.

Однако, где-то между Spark 2.0.2 и 2.3.x, реализация изменилась, и это, и у вас есть null, чтобы обратить на это ваше внимание.

Как это решить? Просто удалите .SSSSSS и это выглядит так:

val result = testData
  .withColumn("time1", unix_timestamp(col("sts"), "yyyy-MM-dd-HH.mm.ss").cast(TimestampType))
  .withColumn("time2", unix_timestamp(col("sts"), "yyyy-MM-dd-HH.mm.ss").cast(TimestampType))

result.select("time1", "time2", "sts", "mts").show(false)

+-------------------+-------------------+--------------------------+--------------------------+
|time1              |time2              |sts                       |mts                       |
+-------------------+-------------------+--------------------------+--------------------------+
|2018-05-09 06:57:53|2018-05-09 06:57:53|2018-05-09-06.57.53.013198|2018-05-09-06.57.53.013768|
|2018-11-21 04:30:03|2018-11-21 04:30:03|2018-11-21-04.30.03.802212|2018-11-21-04.30.03.804441|
+-------------------+-------------------+--------------------------+--------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...