私は、文字列を取る関数 "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)
あなたの 'toDate'関数はどこですか? –
@SarveshKumarSinghは[mcve]を求めました。 – zero323
私はその機能が重要ではないと思います。私はこの問題が火花の限界やバグかもしれないと思う。私は元の投稿に例を追加しました – Andrew