2017-03-15 7 views
3

スパークではLongTypeを問題なしでTimestampTypeにキャストできます。その後、TimestampTypeDateTypeにキャストしても問題はありません。sparkで長時間の鋳造ができないのはなぜですか?

流れ

long -> timestamp -> date 

そのことが可能です。ただし、LongTypeを直接DateTypeにキャストすることはできません。 Soは

long -> date 

が許可されていません。

内部的には、TimestampTypeは、longであり、DateTypeは、ちょうどintです。

このように...

long -> long -> int // this is fine 
long -> int // this is not fine 

それはなぜですか?なぜ火花が出てdateに直接キャストできるのですか?long

+2

スターターのあいまいさ。さらに、内部表現は外部のものを反映しません(タイムスタンプはミリ秒の精度を持ちますが、キャスト中は長さが秒と解釈されます)。 – zero323

+0

なぜ、長いタイムスタンプからのタイムスタンプへのキャストは問題ありませんか?確かに、タイムスタンプはミリ秒の精度を持ち、日付は日精度を持ちます。しかし、長いことはちょうど長いです。ですから、long型がキャストされていても、何らかの明示的な変換が必要です。なぜなら、 'timestamp'が間にあるかどうかにかかわらず、本質的に情報が失われているからです。 – Tim

+0

なぜそれができないのか厳しい理由があるのであれば、私はそれがあるとは思わない。効果的には、タイムスタンプを(ミリ秒)で表現するという慣習が確立されていますが、そのようなことは数日間はありません。あいまいさも問題です - 整数を(ミリ秒)秒または日として解釈する必要がありますか?また、内部では直接使用されないため、内部表現が適切でないことを確認するには、http://stackoverflow.com/q/42628287/1560062をチェックすることもできます。 – zero323

答えて

-2
val DEFAULT_DATE_FORMAT: String = "yyyy-MM-dd" 
val unixDate: Date = new Date(if (ts > Int.MaxValue) ts else ts * 1000) 
val dateFormatter: SimpleDateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT) 
val date: String = dateFormatter.format(unixDate) 
関連する問題