Как проверить, что значение является меткой времени Unix в Scala? - PullRequest
0 голосов
/ 16 октября 2018

В кадре данных df у меня есть столбец datetime, который содержит значения меток времени.Проблема в том, что в некоторых строках это временные метки Unix, в то время как в других строках это формат yyyyMMddHHmm.Как я могу проверить, что каждое данное значение является меткой времени Unix, и если это не для преобразования его в метку времени?

df.withColumn("timestamp", unix_timestamp(col("datetime")))

Я предполагаю, что следует использовать when...otherwise, но как проверить, что значение является Unixотметка времени?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Если столбец datetime состоит только из строк Unix-timestamp или строк, отформатированных в «yyyyMMddHHmm», вы можете различать два формата строки в зависимости от их длины, так как первый имеет 10 цифр или меньше, тогда как последний является фиксированным 12:

val df = Seq(
  (1, "1538384400"),
  (2, "1538481600"),
  (3, "201809281800"),
  (4, "1538548200"),
  (5, "201809291530")
).toDF("id", "datetime")

df.withColumn("timestamp",
  when(length($"datetime") === 12, unix_timestamp($"datetime", "yyyyMMddHHmm")).
    otherwise($"datetime")
)
// +---+------------+----------+
// | id|    datetime| timestamp|
// +---+------------+----------+
// |  1|  1538384400|1538384400|
// |  2|  1538481600|1538481600|
// |  3|201809281800|1538182800|
// |  4|  1538548200|1538548200|
// |  5|201809291530|1538260200|
// +---+------------+----------+

Если в столбце datetime есть другие строковые форматы, вы можете сузить условия для метки времени Unix до диапазона, соответствующего диапазону даты-времени в вашем наборе данных.Например, метка времени Unix должна представлять собой 10-значный номер записи 2001-09-09 (и в течение следующих 250+ лет) и начинаться с 10 до 15 до настоящего времени:

df.withColumn("timestamp",
  when(length($"datetime") === 12, unix_timestamp($"datetime", "yyyyMMddHHmm")).
    otherwise(when(regexp_extract($"datetime", "^(1[0-5]\\d{8})$", 1) === $"datetime", $"datetime").
      otherwise(null)  // Or, additional conditions for other cases
))
0 голосов
/ 16 октября 2018

Вы можете использовать когда / иначе вместе с методами разбора даты.Вот пример кода.Я дифференцировал, используя только длину строки, но вы также можете проверить результат их анализа.

from pyspark.sql.functions import *

data = [
    ('201001021011',),
    ('201101021011',),
    ('1539721852',),
    ('1539721853',)
]

df = sc.parallelize(data).toDF(['date'])

df2 = df.withColumn('date',
    when(length('date') != 12, from_unixtime('date', 'yyyyMMddHHmm')) \
        .otherwise(col('date'))
)

df3 = df2.withColumn('date', to_timestamp('date', 'yyyyMMddHHmm'))
df3.show()

Выводит следующее:

+-------------------+
|               date|
+-------------------+
|2010-01-02 10:11:00|
|2011-01-02 10:11:00|
|2018-10-16 16:30:00|
|2018-10-16 16:30:00|
+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...