Scala - 在Spark RDD中将字符串转换为日期

时间:2017-04-14 03:40:54

标签: scala apache-spark-sql

我有一个数据集,我正在阅读一个spark RDD,其中date以“2016年9月”和“20010901”的格式表示我需要转换为日期格式,同时使用Case Class创建RDD < / p>

例如, 案例类银行(年龄:整数,工作:字符串,婚姻:字符串,教育:字符串,出生日期:“ 20010901 ”,FiscalMonth:“ 2016年9月”)

如何将“BirthDate”和“FiscalMonth”转换为Scala可识别的日期格式,作为Date可能是哪种格式的日期?

我需要稍后将其拉入spark sql并在其上运行一些查询。

1 个答案:

答案 0 :(得分:1)

一种可能的方式:

case class Person(
               name:String,
               job:String,
               marital:String,
               birthDate:java.util.Date, 
               fiscalMonth:java.util.Date)

object Person {
  def converter(dt:String):java.util.Date = dt match {
    case x if x matches "\\d{8}" => (new java.text.SimpleDateFormat("yyyyMMdd",java.util.Locale.US)).parse(x)
    case x if x matches "\\w+\\s\\d{4}" => (new java.text.SimpleDateFormat("MMMM yyyy", java.util.Locale.US)).parse(x)
    case _ => throw new IllegalArgumentException
  }

  def apply(a:String,b:String,c:String,d:String,e:String) = new Person(
     a,b,c,converter(d),converter(e)
  )
}

val p = Person("john","clerk","married","20121111","September 2008")

将产生:

p: Person = Person(john,clerk,married,Sun Nov 11 00:00:00  GMT 2012,Mon Sep 01 00:00:00 GMT 2008)

并避免从Stringjava.util.Date的令人不舒服的隐式转换def。此方法的问题是您可能需要为最后两个参数实现所有可能的Date和String组合。 There are ways to avoid this。但我认为这应该适合你的情况。