如何从数据帧中获取完整的时间戳值?值被截断

How to get full timestamp value from dataframes? values being truncated

我有一个函数 "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]

我什至尝试过 returns Timestamp.valueOf("1234-01-01 00:00:00.123456789") 的虚拟函数。当应用虚拟函数的 udf 时,它将截断最后 3 纳秒。

我查看了 sqlContext conf 和 spark.sql.parquet.int96AsTimestamp 设置为 True。 (设置为false时我试过了)

我在这里迷路了。是什么导致最后 3 位数字被截断?


例子

函数可以是: def date123(v: String): Timestamp = { Timestamp.valueOf("0001-01-01 00:00:00.123456789") } 它只是一个虚拟函数,应该 return 具有完全纳秒精度的时间戳。

然后我会做一个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,它将 return 一个看起来像 '[0001-01-01 00:00:00.123456] 的数据框'

df.select(u_date123($"x")).collect.foreach(println)

我想我找到了问题所在。

在 spark 1.5.1 上,他们将时间戳数据类型的大小从 12 字节更改为 8 字节

https://fossies.org/diffs/spark/1.4.1_vs_1.5.0/sql/catalyst/src/main/scala/org/apache/spark/sql/types/TimestampType.scala-diff.html

我在 spark 1.4.1 上测试过,它产生了完整的纳秒精度。