2016-03-31 3 views
1

私は、文字列を取る関数 "toDate(v:String):Timestamp"を "MM-DD-YYYY HH24:MI:SS.NS"という形式のタイムスタンプに変換します。データフレームから完全なタイムスタンプ値を取得するには?値が切り捨てられる

私は、関数のUDFを作る:あなたはdataframesにUDFを適用すると

val u_to_date = sqlContext.udf.register("u_to_date", toDate_) 

問題が発生します。結果として生じる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") } それは完全なナノ秒の精度でタイムスタンプを返す必要がありますだけダミー関数です。 DF

`val u_date123 = sqlContext.udf.register("u_date123", date123 _)` 

例:

それから私は、UDFになるだろう、私は文字列を持つデータフレームdfにUDFを適用する場合

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()

、それがデータフレームを返すよう[0001-01-01 00:00:00.123456]のようになります。

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

+2

あなたの 'toDate'関数はどこですか? –

+0

@SarveshKumarSinghは[mcve]を求めました。 – zero323

+0

私はその機能が重要ではないと思います。私はこの問題が火花の限界やバグかもしれないと思う。私は元の投稿に例を追加しました – Andrew

答えて

0

私はこの問題を発見したと思います。

スパーク1.5.1に、彼らは8バイトIは、スパーク1.4.1でテスト

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

に12バイトからタイムスタンプデータ型のサイズを変更し、それが完全なナノ秒の精度を生成します。

+0

ナノ秒精度をサポートする回避策を見つけましたか? –

関連する問題