RecordBatchは、Arrowのデータを扱う構造体。
use std::sync::Arc; use arrow::{ array::{ArrayRef, Int32Array, Int64Array, RecordBatch, StringArray}, datatypes::{DataType, Field, Schema}, error::ArrowError, };
fn main() -> Result<(), ArrowError> { let field1 = Field::new("foo", DataType::Int32, false); let field2 = Field::new("bar", DataType::Int64, true); let field3 = Field::new("zzz", DataType::Utf8, true); let fields = vec![field1, field2, field3]; let schema = Arc::new(Schema::new(fields)); let array1: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4])); let array2: ArrayRef = Arc::new(Int64Array::from(vec![11, 22, 33, 44])); let array3: ArrayRef = Arc::new(StringArray::from(vec!["aaa", "bbb", "ccc", "ddd"])); let arrays = vec![array1, array2, array3]; let batch = RecordBatch::try_new(schema, arrays)?; println!("{:?}", batch); Ok(()) }
RecordBatchを作るには、まずSchemaを用意する。
Schemaは複数のFieldで構成される。
Field::new()の第1引数はカラム名、第2引数はデータ型、第3引数はnullable。
データはarrow::array::Arrayで用意する。
データ型に応じて、Int32ArrayやStringArray等の構造体を使用する。
Int32ArrayやStringArray等は、Int32BuilderやStringBuilder等のビルダーを使って作ることも出来る。
use std::sync::Arc; use arrow::{ array::{ArrayRef, Int32Builder, Int64Builder, RecordBatch, StringBuilder}, datatypes::{DataType, Field, Schema}, error::ArrowError, };
let mut builder1 = Int32Builder::new(); let mut builder2 = Int64Builder::new(); let mut builder3 = StringBuilder::new(); for (foo, bar, zzz) in [(1, 11, "aaa"), (2, 22, "bbb")] { builder1.append_value(foo); builder2.append_value(bar); builder3.append_value(zzz); } let array1: ArrayRef = Arc::new(builder1.finish()); let array2: ArrayRef = Arc::new(builder2.finish()); let array3: ArrayRef = Arc::new(builder3.finish()); let arrays = vec![array1, array2, array3];
builderに対してappend_value()で値を追加していく。
append_null()でnullを追加することも出来る。