验证输入火花数据帧中的时间戳以生成正确的输出火花数据帧

Posted

技术标签:

【中文标题】验证输入火花数据帧中的时间戳以生成正确的输出火花数据帧【英文标题】:Validate time_stamp in input spark dataframe to generate correct output spark dataframe 【发布时间】:2019-08-19 10:11:26 【问题描述】:

我有一个包含多列的 spark 数据框。其中之一是“t_s”列。 我想生成一个具有以下条件的新数据框: 一种。如果“t_s”列的值为空,或者格式不正确,则生成 current_timestamp。 湾。如果“t_s”列的值不为空且格式正确,则使用相同的值。

我已经编写了以下代码,但我也想插入代码以检查“t_s”是否正确?

def generateTimeStamp(df: DataFrame) = 

import spark.implicits._
var updatedDF = df
updatedDF = df.withColumn("t_s", when(($"t_s").isNull, current_timestamp()).otherwise($"t_s"))
updatedDF



val fmt = "yyyy-MM-dd HH:mm:ss"
val df = java.time.format.DateTimeFormatter.ofPattern(fmt)

def isCompatible(s: String) = try 
    java.time.LocalDateTime.parse(s, df)
    true
   catch 
    case e: java.time.format.DateTimeParseException => false
  

我还想通过 isCompatible() 函数调用检查“t_s”列的值的条件。

如何做到这一点?

【问题讨论】:

为什么可以使用 sparksql 并将 t_s 列转换为所需的日期时间格式,这应该可以达到目的。 我想如果转换失败,它会返回空值,我不希望将其作为结果数据帧的一部分。要么我想要正确的现有值,否则新生成的 current_timestamp()。 【参考方案1】:

怎么样:

val fmt = "yyyy-MM-dd HH:mm:ss"

val df = Seq(
  "2019-10-21 14:45:23",
  "2019-10-22 14:45:23",
  null,
  "2019-10-41 14:45:23", //invalid day
).toDF("ts")


df.withColumn("ts", to_timestamp($"ts", fmt))
  .withColumn("ts", when($"ts".isNull, date_format(current_timestamp(), fmt)).otherwise($"ts"))
  .show(false)

+-------------------+
|ts                 |
+-------------------+
|2019-10-21 14:45:23|
|2019-10-22 14:45:23|
|2019-08-20 13:54:23|
|2019-08-20 13:54:23|
+-------------------+

【讨论】:

以上是关于验证输入火花数据帧中的时间戳以生成正确的输出火花数据帧的主要内容,如果未能解决你的问题,请参考以下文章

减少火花返回字典而不是数据帧中的操作

迭代火花数据帧中的每一行并检查每一行是不是包含某个值

将字符串格式的科学记数法转换为火花数据帧中的数字[重复]

从火花数据帧中读取结构[重复]

计算火花数据框中的字数

火花不同的输入/输出目录大小(对于相同的数据)