我有一个函数“toDate(v:String):Timestamp”,它接受一个字符串并将其转换为格式为“MM-DD-YYYY HH24:MI:SS.NS”的时间戳。
我做了一个函数的udf:
val u_to_date = sqlContext.udf.register("u_to_date", toDate_)
当您将 UDF 应用于dataframes
. 结果dataframe
将丢失最后 3 纳秒。例如,当使用参数“0001-01-01 00:00:00.123456789”时,生成的数据帧将采用 [0001-01-01 00:00:00.123456] 格式
我什至尝试了一个返回的虚拟函数Timestamp.valueOf("1234-01-01 00:00:00.123456789")
。应用udf
dummy 函数时,它将截断最后 3 纳秒。
我查看了 sqlContext conf 并将 spark.sql.parquet.int96AsTimestamp 设置为 True。(我在设置为 false 时尝试过)
我在这里迷路了。是什么导致最后 3 位数字被截断?
例子
该函数可能是:
def date123(v: String): Timestamp = {
Timestamp.valueOf("0001-01-01 00:00:00.123456789")
}
它只是一个虚拟函数,应该返回具有完整纳秒精度的时间戳。
然后我会做一个udf:
`val u_date123 = sqlContext.udf.register("u_date123", date123 _)`
示例 df:
val theRow =Row("blah")
val theRdd = sc.makeRDD(Array(theRow))
case class X(x: String )
val df = theRdd.map{case Row(s0) => X(s0.asInstanceOf[String])}.toDF()
如果我将 udf 应用于df
带有字符串列的数据帧,它将返回一个看起来像“[0001-01-01 00:00:00.123456]”的数据帧
df.select(u_date123($"x")).collect.foreach(println)