在Spark& Column方法中使用隐式类

时间:2016-04-22 08:57:13

标签: scala apache-spark

我有以下简单的隐式类:

object Utils {     
  implicit class StringUtils(s: String) {
    private val iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")
    def toUTC: Instant = iso8601.parse(s).toInstant
  }
}

我想在DataFrame上使用它,它有几个无类型的时间戳(即类型String),我想创建具有这些时间戳的新列,同时保持原始的(以防万一)。

我查看了DataFrame.withColumn,但它的签名需要Column,我的toUTC方法仅适用于字符串。所以,这显然不起作用:

df.withColumn("typed_ts", df("stringy_ts").toUTC)

我知道我可以通过编写动态SQL在SQLContext中完成它,但我讨厌这样做,因为它很快就会变得混乱。

有没有办法让这项工作?这甚至是推荐的吗?

注意:我坚持使用Spark 1.4.1。

编辑:感谢this question我现在知道我必须创建一个udf[Instant, String]。但是,不支持Instant

java.lang.UnsupportedOperationException: Schema for type java.time.Instant is not supported
    at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:152)
    at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:28)
    at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:63)
    at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:28)
    at org.apache.spark.sql.functions$.udf(functions.scala:1363)

关于使用什么时间表示的任何想法?最后我需要将数据转储到Hive中,所以理想情况下它可以与ORC / Parquet一起使用...

0 个答案:

没有答案