Если столбец 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
))