我有一个函数" 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
时,它将截断最后3纳秒。
我已经查看了sqlContext conf和 spark.sql.parquet.int96AsTimestamp设置为True。 (当它被设置为假时我试过了)
我迷失在这里。导致最后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]&#39; <的数据框。 / p>
df.select(u_date123($"x")).collect.foreach(println)
答案 0 :(得分:0)
我想我发现了这个问题。
在spark 1.5.1上,他们将timestamp数据类型的大小从12个字节更改为8个字节
我测试了火花1.4.1,它产生了完整的纳秒精度。