我有以下简单的隐式类:
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一起使用...