1

我有一个函数“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")。应用udfdummy 函数时,它将截断最后 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)

4

1 回答 1

0

我想我找到了问题所在。

在 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 上进行了测试,它产生了完整的纳秒精度。

于 2016-03-31T22:55:06.230 回答