這是Arrow元數(shù)據(jù)規(guī)范的文檔,它使系統(tǒng)能夠通信
創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、app軟件開發(fā)、小程序設(shè)計(jì)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
我們正在使用Flatbuffers進(jìn)行低開銷讀寫Arrow元數(shù)據(jù)。請(qǐng)參閱Message.fbs。
??Schema類型描述了由任意數(shù)量的Arrow數(shù)組組成的表狀結(jié)構(gòu),每個(gè)Arrow數(shù)組可以被解釋為表中的一列。模式本身不描述任何特定數(shù)據(jù)集的物理結(jié)構(gòu)。
模式由一系列字段組成,這些字段是描述列的元數(shù)據(jù)。Flatbuffers IDL的一個(gè)字段是:
table Field {
// Name is not required, in i.e. a List
name: string;
nullable: bool;
type: Type;
// present only if the field is dictionary encoded
// will point to a dictionary provided by a DictionaryBatch message
dictionary: long;
// children apply only to Nested data types like Struct, List and Union
children: [Field];
/// layout of buffers produced for this type (as derived from the Type)
/// does not include children
/// each recordbatch will return instances of those Buffers.
layout: [ VectorLayout ];
// User-defined metadata
custom_metadata: [ KeyValue ];
}
type是字段的邏輯類型。嵌套類型(如List,Struct和Union)具有一系列子字段。
還提供了該模式的JSON表示形式:字段:
{
"name" : "name_of_the_field",
"nullable" : false,
"type" : /* Type */,
"children" : [ /* Field */ ],
"typeLayout" : {
"vectors" : [ /* VectorLayout */ ]
}
}
VectorLayout:
{
"type" : "DATA|OFFSET|VALIDITY|TYPE",
"typeBitWidth" : /* int */
}
Type:
{
"name" :"null|struct|list|union|int|floatingpoint|utf8|binary|fixedsizebinary|bool|decimal|date|time|timestamp|interval"
// fields as defined in the Flatbuffer depending on the type name
}
Union:
{
"name" : "union",
"mode" : "Sparse|Dense",
"typeIds" : [ /* integer */ ]
}
在Union中的typeIds字段是用于表示每種類型的編碼,其可以與從子數(shù)組的索引不同。這樣就可以使用聯(lián)合類型ids不需要從0開始枚舉。
Int:
{
"name" : "int",
"bitWidth" : /* integer */,
"isSigned" : /* boolean */
}
FloatingPoint:
{
"name" : "floatingpoint",
"precision" : "HALF|SINGLE|DOUBLE"
}
Decimal:
{
"name" : "decimal",
"precision" : /* integer */,
"scale" : /* integer */
}
Timestamp:
{
"name" : "timestamp",
"unit" : "SECOND|MILLISECOND|MICROSECOND|NANOSECOND"
}
Date:
{
"name" : "date",
"unit" : "DAY|MILLISECOND"
}
Time:
{
"name" : "time",
"unit" : "SECOND|MILLISECOND|MICROSECOND|NANOSECOND",
"bitWidth": /* integer: 32 or 64 */
}
Interval:
{
"name" : "interval",
"unit" : "YEAR_MONTH|DAY_TIME"
}
Schema:
{
"fields" : [
/* Field */
]
}
??RecordBatch是頂級(jí)命名的等長(zhǎng)Arrow數(shù)組(或向量)的集合。如果其中一個(gè)數(shù)組包含嵌套數(shù)據(jù),則其子數(shù)組不需要與頂級(jí)數(shù)組的長(zhǎng)度相同。
?可以被認(rèn)為是特定模式的實(shí)現(xiàn)。描述特定RecordBatch的元數(shù)據(jù)稱為“數(shù)據(jù)頭”。這是用于RecordBatch數(shù)據(jù)頭的Flatbuffers的IDL
table RecordBatch {
length: long;
nodes: [FieldNode];
buffers: [Buffer];
}
??所述RecordBatch元數(shù)據(jù)提供與長(zhǎng)度超過2^31- 1的記錄批次,但Arrow實(shí)現(xiàn)不要求實(shí)現(xiàn)支持超出這一大小。
?通過對(duì)給定的內(nèi)存中數(shù)據(jù)集的模式(可能包含嵌套類型)進(jìn)行深度優(yōu)先遍歷/扁平化,生成nodes和buffers字段。
??緩沖區(qū)是描述相對(duì)于某些虛擬地址空間的連續(xù)內(nèi)存區(qū)域的元數(shù)據(jù)。這可能包括:
文件中的數(shù)據(jù)
緩沖區(qū)類型的鍵形式是:
struct Buffer {
offset: long;
length: long;
}
??在record batch的上下文中,每個(gè)字段具有與其相關(guān)聯(lián)的一些數(shù)量的緩沖區(qū),它們?cè)从谄湮锢韮?nèi)存布局。
?每個(gè)邏輯類型(與其子節(jié)點(diǎn)分開,如果它是一個(gè)嵌套類型)具有與之相關(guān)聯(lián)的確定性數(shù)量的緩沖區(qū)。這些將在邏輯類型部分中指定。
??所述FieldNode值包含關(guān)于在嵌套類型層次每個(gè)等級(jí)的元數(shù)據(jù)。
struct FieldNode {
/// The number of value slots in the Arrow array at this level of a nested
/// tree
length: long;
/// The number of observed nulls.
null_count: lohng;
}
??所述FieldNode元數(shù)據(jù)提供長(zhǎng)度超過2^31- 1的字段,但是Arrow不要求實(shí)現(xiàn)支持大型數(shù)組。
??嵌套類型以深度優(yōu)先順序在record batch中扁平化。當(dāng)訪問嵌套類型樹中的每個(gè)字段時(shí),元數(shù)據(jù)將附加到頂級(jí)fields數(shù)組,并將與該字段相關(guān)聯(lián)的緩沖區(qū)(但不是其子級(jí))附加到buffers數(shù)組。
?例如,讓我們考慮模式:
col1: Struct, c: Float64>
col2: Utf8
其扁平化版本是:
FieldNode 0: Struct name='col1'
FieldNode 1: Int32 name=a'
FieldNode 2: List name='b'
FieldNode 3: Int64 name='item' # arbitrary
FieldNode 4: Float64 name='c'
FieldNode 5: Utf8 name='col2'
??對(duì)于生成的緩沖區(qū),將具有以下內(nèi)容(如下面對(duì)于每種類型的更詳細(xì)描述):
buffer 0: field 0 validity bitmap
buffer 1: field 1 validity bitmap
buffer 2: field 1 values
buffer 3: field 2 validity bitmap
buffer 4: field 2 list offsets
buffer 5: field 3 validity bitmap
buffer 6: field 3 values
buffer 7: field 4 validity bitmap
buffer 8: field 4 values
buffer 9: field 5 validity bitmap
buffer 10: field 5 offsets
buffer 11: field 5 data
??邏輯類型由類型名稱和元數(shù)據(jù)以及對(duì)物理內(nèi)存表示的顯式映射組成。這些可能分為不同的類別:
??在Arrow的第一個(gè)版本中,我們提供標(biāo)準(zhǔn)的8位到64位大小的標(biāo)準(zhǔn)C整數(shù)類型,包括有符號(hào)和無符號(hào):
● 有符號(hào)類型:Int8,Int16,Int32,Int64
● 無符號(hào)類型:UInt8,UInt16,UInt32,UInt64
?IDL看起來像:
table Int {
bitWidth: int;
is_signed: bool;
}
??整數(shù)字節(jié)順序當(dāng)前在模式級(jí)別全局設(shè)置。如果一個(gè)模式設(shè)置為little-endian(低位編址),那么出現(xiàn)在其中的所有整數(shù)類型都必須是little-endian。整數(shù)作為其他數(shù)據(jù)表示的一部分(如列表偏移量和聯(lián)合類型)必須與整個(gè)Record Batch具有相同的字節(jié)順序。
??我們提供3種類型的浮點(diǎn)數(shù)作為固定位寬的基本數(shù)組
enum Precision:int {HALF, SINGLE, DOUBLE}
table FloatingPoint {
precision: Precision;
}
??布爾邏輯類型表示為1位寬的基本(原語)物理類型。這些位使用最低有效位(LSB)排序進(jìn)行編號(hào)。
?像其他固定的位寬基本類型一樣,布爾數(shù)據(jù)在數(shù)據(jù)頭中顯示為2個(gè)緩沖區(qū)(一個(gè)位圖為有效向量,另一個(gè)為值)。
??List邏輯類型是(和相同名稱)列表物理類型的邏輯對(duì)應(yīng)。
?在數(shù)據(jù)頭格式中,List字段節(jié)點(diǎn)包含2個(gè)緩沖區(qū):
??我們?yōu)榭勺冮L(zhǎng)度字節(jié)指定兩種邏輯類型:
??TBD
??所有時(shí)間戳都以64位整數(shù)存儲(chǔ),有四個(gè)單位:秒,毫秒,微秒和納秒。
??支持兩種不同的日期類型:
??時(shí)間支持相同的單位:秒,毫秒,微秒和納秒。我們將時(shí)間表示為容納指定單位的最小整數(shù)。對(duì)于秒和毫秒:32位,其他64位。