2016-11-30 11 views
1

と注文したファイルをフィルタリングし、私はフォーマットの大きなログファイルている想像してみて:は、効率的に火花

Timestamp, text 
Timestamp, text 
Timestamp, text 
Timestamp, text 
Timestamp, text 
Timestamp, text 

ログファイルがすでにタイムスタンプによって順序付けされます。 ファイルをsparkでデータフレームとして読み取り、t1とt2のタイムスタンプでフィルタリングすると、 タイムスタンプがt1とt2の間にあるかどうかチェックします。

しかし、dfがすでに注文されていることをスパークする方法はありますか?そうすれば、最初と最後のタイムスタンプを探し、その間にあるすべての行を返すだけですもっと速い?

+1

理想的なソリューションは、あなたの入力を分割するために、次のようになりますので、適切なwhereフィルタリングを次のクエリは、範囲内にないディレクトリからファイルをOMMITます)書き換えられたファイル内に保存しますあなたの 'Timestamp'でファイルを開き、実際に必要なファイルだけを読み込みます。 Sparkは述語のプッシュダウンをサポートしています。もしあなたが 'spark.read.parquet(myParquet.parq).filter(...)'を実行した場合は、関連ファイルを読み込むだけです。 –

答えて

3

いいえ、スパークのようなオプションはありません。しかし、パーティション化と呼ばれるイベントやログを保存するシステムで広く使用されている、さまざまなソリューションがあります。あなたは多くの日からレコードを持っている場合は、一日で新しい列を追加します。その後、

df.withColumn("day", df.timestamp.cast("date")) 

partitionedByを使用してこのファイルを保存します。

df_with_day.write.partitionBy("day").csv("partitioned") 

はこれが毎日のためのディレクトリを作成します(とカラムの日はしませんが

new_df = spark.read.csv("partitioned") 
new_df.where(new.day.between("2016-11-30", "2016-12-10")).show()