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

时间:2016-03-31 00:19:39

标签: scala apache-spark apache-spark-sql sql-timestamp

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

1 个答案:

答案 0 :(得分:0)

我想我发现了这个问题。

在spark 1.5.1上,他们将timestamp数据类型的大小从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

我测试了火花1.4.1,它产生了完整的纳秒精度。