即使给定隐式函数

时间:2015-07-29 19:19:06

标签: scala scalding

我有一个Scalding数据流,它以一堆Pipe分隔值文件开头。第一列是稍微非标准格式的DateTime。我想使用强类型的TypedPipe API,因此我指定了一个元组类型和一个案例类来包含数据:

type Input = (DateTime, String, Double, Double, String)

case class LatLonRecord(date : DateTime, msidn : String, lat : Double, lon : Double, cellname : String)  

然而,Scalding并不知道如何将String强制转换为DateTime,所以我尝试添加一个隐式函数来执行脏工作:

implicit def stringToDateTime(dateStr: String): DateTime =
  DateTime.parse(dateStr, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"))

但是,我仍然得到ClassCastException

val lines: TypedPipe[Input] = TypedPipe.from(TypedPsv[Input](args("input")))

lines.map(x => x._1).dump

//cascading.flow.FlowException: local step failed   at java.lang.Thread.run(Thread.java:745)
//Caused by: cascading.pipe.OperatorException: [FixedPathTypedDelimite...][com.twitter.scalding.RichPipe.eachTo(RichPipe.scala:509)] operator Each failed executing operation
//Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.joda.time.DateTime

我需要做些什么才能让Scalding调用我的转换函数?

1 个答案:

答案 0 :(得分:0)

所以我最终这样做了:

case class LatLonRecord(date : DateTime, msisdn : String, lat : Double, lon : Double, cellname : String)

object dateparser {
  val format =  DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S")
  def parse(s : String) : DateTime = DateTime.parse(s,format);
}

//changed first column to a String, yuck
type Input = (String, String, Double, Double, String)
val lines: TypedPipe[Input] = TypedPipe.from( TypedPsv[Input]( args("input")) )
val recs = lines.map(v => LatLonRecord(dateparser.parse(v._1), v._2, v._3,v._4, v._5))

但我觉得它是次优解决方案。我喜欢那些使用Scala超过1周的人的更好答案,比如我。