`IcebergTableScan` ignores the session's `batch_size`

オープン 初心者向け
#100 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
82/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
rust
領域
backend

調査の方向性

crates/datafusion/src/read/scan.rsから始め、IcebergDataSource::openからget_batch_streamまでを追い、セッションのバッチサイズがTableScanBuilderにどのように渡されるかを確認してください。このissueには、設定されたサイズを渡してwith_batch_sizeを呼び出す変更案が含まれています。スキャンが常に1,024行のバッチを使用するのではなく、datafusion.execution.batch_sizeに従うようになれば完了です。

索引モデルが issue の本文から書いたものです。

説明

IcebergDataSource::open does not pass execution.batch_size from the session config to get_batch_stream:

https://github.com/apache/datafusion-iceberg/blob/256c4b7bde01a5eee9e4c6b417a36dbe3eb761ec/crates/datafusion/src/read/scan.rs#L182-L198

get_batch_stream never calls TableScanBuilder::with_batch_size:

https://github.com/apache/datafusion-iceberg/blob/256c4b7bde01a5eee9e4c6b417a36dbe3eb761ec/crates/datafusion/src/read/scan.rs#L297-L305

So scans always read arrow-rs's default of 1,024-row batches. That's an eighth of DataFusion's default of 8,192, and SET datafusion.execution.batch_size has no effect on them.

Suggested fix:

--- a/crates/datafusion/src/read/scan.rs
+++ b/crates/datafusion/src/read/scan.rs
@@ -195,6 +195,7 @@ impl DataSource for IcebergDataSource {
                 .execution
                 .parquet
                 .enable_page_index,
+            context.session_config().batch_size(),
         );
         let stream = futures::stream::once(fut).try_flatten();
 
@@ -281,6 +282,7 @@ async fn get_batch_stream(
     column_names: Option<Vec<String>>,
     predicate: Option<Predicate>,
     enable_page_index: bool,
+    batch_size: usize,
 ) -> Result<Pin<Box<dyn Stream<Item = Result<RecordBatch>> + Send>>> {
     let scan_builder = match snapshot_id {
         Some(snapshot_id) => table.scan().snapshot_id(snapshot_id),
@@ -296,6 +298,7 @@ async fn get_batch_stream(
     }
     let table_scan = scan_builder
         .with_row_selection_enabled(enable_page_index)
+        .with_batch_size(Some(batch_size))
         .build()
         .map_err(to_datafusion_error)?;
主要言語
Rust
スター
33
フォーク
34
平均マージ
4日 14時間
マージ済み PR(30日)
10

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

apache/datafusion-iceberg のほかの issue

apache/datafusion-iceberg の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。