Buffers は、コンシューマーとプロデューサーの両方が既にスキーマとカラム順序を把握していることを前提とした、一時的な データ交換向けの非常にシンプルなバイナリ形式です。
Native と異なり、カラム名、カラム型、その他の追加メタデータは保持しません。
この形式では、データはバイナリ形式で blocks 単位で書き込みおよび読み出しが行われます。Buffers は Native フォーマットと同じカラム単位のバイナリ表現を使用し、同じ Native フォーマットの設定に従います。
各ブロックごとに、次のシーケンスが書き込まれます:
- カラム数 (UInt64, リトルエンディアン)。
- 行数 (UInt64, リトルエンディアン)。
- 各カラムごとに:
- シリアライズされたカラムデータの合計バイトサイズ (UInt64, リトルエンディアン)。
- Native フォーマットと完全に同一のシリアライズ済みカラムデータのバイト列。
使用例
ファイルに書き込む:
SELECT
number AS num,
number * number AS num_square
FROM numbers(10)
INTO OUTFILE 'squares.buffers'
FORMAT Buffers;
明示的にカラム型を指定して読み出します:
SELECT
*
FROM file(
'squares.buffers',
'Buffers',
'col_1 UInt64, col_2 UInt64'
);
┌─col_1─┬─col_2─┐
│ 0 │ 0 │
│ 1 │ 1 │
│ 2 │ 4 │
│ 3 │ 9 │
│ 4 │ 16 │
│ 5 │ 25 │
│ 6 │ 36 │
│ 7 │ 49 │
│ 8 │ 64 │
│ 9 │ 81 │
└───────┴───────┘
同じカラム型を持つテーブルがある場合は、そのテーブルに直接データを取り込めます。
CREATE TABLE number_squares
(
a UInt64,
b UInt64
) ENGINE = Memory;
INSERT INTO number_squares
FROM INFILE 'squares.buffers'
FORMAT Buffers;
テーブルを確認します。
SELECT * FROM number_squares;
┌─a─┬──b─┐
│ 0 │ 0 │
│ 1 │ 1 │
│ 2 │ 4 │
│ 3 │ 9 │
│ 4 │ 16 │
│ 5 │ 25 │
│ 6 │ 36 │
│ 7 │ 49 │
│ 8 │ 64 │
│ 9 │ 81 │
└───┴────┘