1

文字列を取り、それを「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)

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 に答える