sparkは、ディレクトリを継続的に監視し、ファイルがそのディレクトリに表示されたらすぐにspark.readStream
を使用してCSVファイルを読み取ります。
Sparkストリーミングのソリューションを含めないでください。spark構造化ストリーミングを使用してそれを行う方法を探しています。
このユースケースの完全なソリューションは次のとおりです。
スタンドアロンモードで実行している場合。次のようにドライバメモリを増やすことができます。
bin/spark-Shell --driver-memory 4G
スタンドアロンモードのエグゼキュータはドライバ内で実行されるため、エグゼキュータメモリを設定する必要はありません。
@ T.Gawedaのソリューションの完了として、以下のソリューションを見つけてください。
val userSchema = new StructType().add("name", "string").add("age", "integer")
val csvDF = spark
.readStream
.option("sep", ";")
.schema(userSchema) // Specify schema of the csv files
.csv("/path/to/directory") // Equivalent to format("csv").load("/path/to/directory")
csvDf.writeStream.format("console").option("truncate","false").start()
これで、sparkは指定されたディレクトリを継続的に監視し、ディレクトリにcsvファイルを追加するとすぐに、DataFrame操作「csvDF」がそのファイルに対して実行されます。
注:sparkで推論する場合は、最初に次の構成を設定する必要があります。
spark.sqlContext.setConf("spark.sql.streaming.schemaInference","true")
ここで、sparkはあなたのsparkセッションです。
公式に書かれているように ドキュメント 「ファイル」ソースを使用する必要があります:
ファイルソース-ディレクトリに書き込まれたファイルをデータのストリームとして読み取ります。サポートされているファイル形式は、text、csv、json、parquetです。最新のリスト、および各ファイル形式でサポートされているオプションについては、DataStreamReaderインターフェイスのドキュメントを参照してください。ファイルは指定されたディレクトリにアトミックに配置する必要があることに注意してください。ほとんどのファイルシステムでは、ファイル移動操作によって実現できます。
ドキュメントから抜粋したコード例:
// Read all the csv files written atomically in a directory
val userSchema = new StructType().add("name", "string").add("age", "integer")
val csvDF = spark
.readStream
.option("sep", ";")
.schema(userSchema) // Specify schema of the csv files
.csv("/path/to/directory") // Equivalent to format("csv").load("/path/to/directory")
トリガーを指定しない場合、Sparkはできるだけ早く新しいファイルを読み取ります