カラムタイプ
一般的な情報については、データタイプを参照してください。
数値タイプ
数値タイプのエンコーディングは、AMD64やARM64のようなリトルエンディアンCPUのメモリレイアウトと一致しています。
これにより、非常に効率的なエンコーディングとデコーディングを実現できます。
整数
IntとUIntの8, 16, 32, 64, 128または256ビットの文字列で、リトルエンディアン形式です。
浮動小数点数
IEEE 754のバイナリ表現でのFloat32とFloat64です。
文字列
単なる文字列の配列です。つまり、(len, value)。
FixedString(N)
Nバイトシーケンスの配列です。
IP
IPv4はUInt32数値型のエイリアスで、UInt32として表現されます。
IPv6はFixedString(16)のエイリアスで、バイナリで直接表現されます。
Tuple
Tupleは単にカラムの配列です。例えば、Tuple(String, UInt8)は2つのカラムが連続してエンコードされたものです。
Map
Map(K, V)は3つのカラムから成ります: Offsets ColUInt64, Keys K, Values V。
KeysとValuesカラムの行数はOffsetsの最後の値です。
配列
Array(T)は2つのカラムから成ります: Offsets ColUInt64, Data T。
Dataの行数はOffsetsの最後の値です。
Nullable
Nullable(T)はNulls ColUInt8, Values Tという同じ行数を持つ内容で構成されています。
// NullsはValuesカラムに対するnullableの「マスク」です。
// 例えば、[null, "", "hello", null, "world"]をエンコードする場合
// Values: ["", "", "hello", "", "world"] (len: 5)
// Nulls: [ 1, 0, 0, 1, 0] (len: 5)
UUID
FixedString(16)のエイリアスで、UUID値はバイナリで表現されます。
Enum
Int8またはInt16のエイリアスですが、それぞれの整数がいくつかのString値にマッピングされています。
Low Cardinality
LowCardinality(T)はIndex T, Keys Kから成り、KはIndexのサイズに応じて(UInt8, UInt16, UInt32, UInt64)のいずれかです。
// インデックス(すなわち、Dictionary)カラムはユニークな値を含み、Keysカラムは
// インデックスカラムのインデックスのシーケンスを含み、それが実際の値を表します。
//
// 例えば、["Eko", "Eko", "Amadela", "Amadela", "Amadela", "Amadela"]は
// 以下のようにエンコードできます:
// Index: ["Eko", "Amadela"] (String)
// Keys: [0, 0, 1, 1, 1, 1] (UInt8)
//
// CardinalityKeyはIndexサイズに応じて選択されます。選択されたタイプの最大値は、
// Index要素のインデックスを表現できる必要があります。
Bool
UInt8のエイリアスであり、0はfalse、1はtrueを表します。