S-JIS[2026-02-07]

Rust pyo3-arrowメモ

Rustpyo3のpyo3-arrowクレートのメモ。


概要

pyo3-arrowは、PythonのArrowデータをPyO3で受け取ることが出来るクレート。

(PandasのDataFrameをArrowのTableに変換して、pyo3-arrowで受け取ることが出来る)


example-pyo3/Cargo.toml:

〜
[dependencies]
pyo3 = { version = "0.27.2" }
pyo3-arrow = "0.15.0"

pyo3のバージョンに応じて、pyo3-arrowのバージョンを決める。
対応バージョンはpyo3-arrowのVersion compatibilityに書かれている。

pyo3 0.27ではpyo3-arrow 0.15を使用する。


ArrowのTableを受け取る例。

    use pyo3::prelude::*;
    use pyo3_arrow::PyTable;
    #[pyfunction]
    pub fn arrow_example(table: PyTable) {
        let (batches, schema) = table.into_inner();
        // batches: Vec<RecordBatch>
        // schema: Arc<Schema>

        let fields = schema.fields(); // &Fields
        for field in fields {
            let name = field.name();           // &String
            let data_type = field.data_type(); // &DataType
            println!("name={}, type={}", name, data_type);
        }

        for batch in batches {
            let columns = batch.columns(); // &[Arc<Array>]
            for (field, array) in fields.iter().zip(columns) {
                let name = field.name();
                let data_type = field.data_type();
                println!("name={}, type={:?}, values={:?}", name, data_type, array);
            }
        }
    }

columnsはデータ本体で、Arrayの配列。
Arrayの実体としてはPrimitiveArray<Int32>やStringArray等。


呼び出す例

Pythonプロジェクト側で、pyarrowモジュールを依存ライブラリーに追加しておく。
(ついでにpandasも追加しておく)

cd call-pyo3
uv add pyarrow
uv add pandas

call-pyo3/main.py:

import example_pyo3
def arrow_example():
    import pandas as pd
    import pyarrow as pa

    df = pd.DataFrame(
        {
            "foo": pd.Series([0, 1, 2, 3], dtype="int32"),
            "bar": pd.Series([None, 100, 200, 900], dtype="Int64"),
            "zzz": pd.Series([None, "abc", "def", "ghi"], dtype="string"),
        }
    ).convert_dtypes(dtype_backend="pyarrow")

    table = pa.Table.from_pandas(df)

    example_pyo3.arrow_example(table)

pyo3へ戻る / Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま