文字列を取り、それを「MM-DD-YYYY HH24:MI:SS.NS」形式のタイムスタンプに変換する関数「toDate(v:String):Timestamp」があります。
関数の 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 に設定されています。(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)