2016-04-19 7 views
0

私はSpark 1.3を使用しています。私はいくつかの日付ベースの計算をしたい。次のデータセットでは、一意のIDごとに、beging_dateが最大(最新のレコード)のレコードを取得します。SparkSQL datetime関数

また、ファイルからデータを読み込むときに、TimestampType(import org.apache.spark.sql.types.TimestampType)としてキャストする必要がありますか?ここ

は、いくつかのサンプルデータである:

ID beging_date END_DATE

1 2016年1月1日20:06:00.0 2016年1月4日20:06:00.0

2 1/2013分の5 20:06:00.0 2016年1月8日20:06:00.0

1 2013年1月6日20:06:00.0 2016年1月18日20:06:00.0

3 2/1/2013 20:06:00.0 2/5/2016 20: 06:00.0

1 2013年1月20日20:06:00.0 2016年2月4日20:06:00.0

3 2013年3月5日20:06:00.0 2016年3月8日20: 06:

のID beging_dateのEND_DATE

1 2013年1月20日20:06:00.0 2016年2月4日20:06:00.0

ここ00.0

は、所望の出力であります

2 2013年1月5日20:06:00.0 2016年1月8日20:06:00.0

3 2013年3月5日20:06:00.0 2016年3月8日20:06:00.0

答えて

1

日付を扱うときには、データがディスクに格納されているかシリアル化されているか、オブジェクトとしてメモリにどのように格納されているかを別々に話すことが重要だと思います。

日付は文字列としてシリアル化されます。文字列表現はかなり劣悪な表現です。 TimestampTypeLongType、さらにはDoubleTypeの背後にあるのはおそらく私の4番目の選択です。ストリングを解析することは常に苦痛です。一方、あなたの日付はすでにStringsとしてシリアル化されていますが、それを変更する必要はありますか?

元の列をそのままにして、データの整列に役立つ新しい列を作成することを検討します。

私は次のポイントにつきます。どのようにしてオブジェクト内のオブジェクトとして日付を表現したいのかは、その使い方を完全に変えます。 「最大値を見つける」のような操作の場合、最も簡単な操作はLongType(1970年1月1日以降のミリ秒数)に変換することです。ほぼすべての日付関連のオブジェクトと関数は、unixタイムスタンプを取り込むか吐き出すことができるので、前後に簡単に変換できます。

文字列をTimestampTypeに変換するには、java.sql.Timestampに変換する必要があります。私はあなただけmillis_since_1_1_1970後に停止して、比較値としてそのLong値を使用することができ、言ったように

import java.sql.Timestamp 
import java.text.SimpleDateFormat 

val formatter = new SimpleDateFormat(...) 
val millis_since_1_1_1970 = formatter.parse("1/5/2013 20:06:00.0").getTime 
val timestamp = new java.sql.Timestamp(millis_since_1_1_1970) 

:私は、正確な書式設定を把握していますが、のような何かをしたいあなたにそれを残しておきます。あなたの目的のために、それは動作します

関連する問題