Sparkを介して1億レコードのORCファイルとデータフレーム(たとえば100レコード)を結合しようとしています(各レコードは4〜50億、25バイトに増加する可能性があります)。また、Spark hiveContext API を使用して作成されます。
ORC ファイル作成コード
//fsdtRdd is JavaRDD, fsdtSchema is StructType schema
DataFrame fsdtDf = hiveContext.createDataFrame(fsdtRdd,fsdtSchema);
fsdtDf.write().mode(SaveMode.Overwrite).orc("orcFileToRead");
ORC ファイル読み取りコード
HiveContext hiveContext = new HiveContext(sparkContext);
DataFrame orcFileData= hiveContext.read().orc("orcFileToRead");
// allRecords is dataframe
DataFrame processDf = allRecords.join(orcFileData,allRecords.col("id").equalTo(orcFileData.col("id").as("ID")),"left_outer_join");
processDf.show();
読み取り中の Spark ログ (ローカルから)
Input split: file:/C:/spark/orcFileToRead/part-r-00024-b708c946-0d49-4073-9cd1-5cc46bd5972b.orc:0+3163348
min key = null, max key = null
Reading ORC rows from file:/C:/spark/orcFileToRead/part-r-00024-b708c946-0d49-4073-9cd1-5cc46bd5972b.orc with {include: [true, true, true], offset: 0, length: 9223372036854775807}
Finished task 55.0 in stage 2.0 (TID 59). 2455 bytes result sent to driver
Starting task 56.0 in stage 2.0 (TID 60, localhost, partition 56,PROCESS_LOCAL, 2220 bytes)
Finished task 55.0 in stage 2.0 (TID 59) in 5846 ms on localhost (56/84)
Running task 56.0 in stage 2.0 (TID 60)
Spark ジョブは正常に完了しましたが、ORC インデックス ファイル機能を利用できないため、先に進む前に ORC データのブロック全体をチェックしていると思います。
質問
-- これは通常の動作ですか、それともデータを ORC 形式で保存する前に何らかの構成を設定する必要がありますか?
-- NORMALの場合、ディスク レベルで一致しないレコードを破棄するように結合する最善の方法は何ですか (ORC データのインデックス ファイルのみが読み込まれる可能性があります)。