ApacheArrow官方文檔-內(nèi)存結(jié)構(gòu)-創(chuàng)新互聯(lián)

定義/術(shù)語

由于不同的項(xiàng)目使用不同的詞語描述各種概念,所以這里有一個小小的術(shù)語表來幫助消除歧義。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供昌江網(wǎng)站建設(shè)、昌江做網(wǎng)站、昌江網(wǎng)站設(shè)計、昌江網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、昌江企業(yè)網(wǎng)站模板建站服務(wù),十載昌江做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
  • 數(shù)組:已知長度具有相同類型的值序列。
  • 槽或數(shù)組槽:一些特定數(shù)據(jù)類型的數(shù)組中的單個邏輯值
  • 連續(xù)的內(nèi)存區(qū)域:給定長度的順序虛擬地址空間。任何字節(jié)都可以通過小于區(qū)域長度的單個指針偏移量來取到。
  • 連續(xù)的內(nèi)存緩沖區(qū):存儲Array的多值組件的連續(xù)內(nèi)存區(qū)域。有時稱為“緩沖區(qū)”。
  • 基本類型:占用固定大小的內(nèi)存槽的數(shù)據(jù)類型,以位寬或字節(jié)寬度指定占用內(nèi)存大小。
  • 嵌套或參數(shù)類型:完整結(jié)構(gòu)依賴于一個或多個其他子對象類型的數(shù)據(jù)類型。當(dāng)且僅當(dāng)子類型相等時,兩個完全指定的嵌套類型相等。例如,如果U和V是不同的相對(簡單)類型,List<U>與List<V> 也不同。
  • 相對類型或簡單類型(不合格):特定的基本類型或完全指定的嵌套類型。當(dāng)我們說槽時,我們是指相對類型值,不一定是任意物理存儲區(qū)域。
  • 邏輯類型:使用某些相對(物理)類型實(shí)現(xiàn)的數(shù)據(jù)類型。例如,存儲在16個字節(jié)中的十進(jìn)制值可以存儲在一個大小為16槽的字節(jié)數(shù)組中 。類似地,字符串可以存儲為 List<1-byte>。
  • 父和子數(shù)組:表示嵌套類型結(jié)構(gòu)中物理值數(shù)組之間關(guān)系的名稱。例如,List<T>類型:父類型的數(shù)組有一個T型數(shù)組作為它的子元素(參見下面的列表)。
  • 葉子節(jié)點(diǎn)或葉子:一個原始值數(shù)組,可能是也可能不是具有嵌套類型的某些數(shù)組的子數(shù)組。

    要求,目標(biāo)和非目標(biāo)

    基本要求

  • 一種物理內(nèi)存布局,可在處理平面和嵌套列式數(shù)據(jù)的各種系統(tǒng)之間進(jìn)行零反序列化的數(shù)據(jù)交換,包括Spark,Drill,Impala,Kudu,Ibis,Spark,ODBC協(xié)議和利用開源組件的專有系統(tǒng)。
  • 所有數(shù)組槽都可以在不間斷的時間內(nèi)訪問,復(fù)雜性在嵌套級別上呈線性增長
  • 能夠表示完全物化和解碼/解壓縮的Parquet 數(shù)據(jù)
  • 所有連續(xù)的內(nèi)存緩沖區(qū)以64字節(jié)邊界對齊,并填充到64字節(jié)的倍數(shù)。
  • 任何相對類型都可以有空槽
  • 數(shù)組一旦創(chuàng)建就不可變。實(shí)現(xiàn)可以提供API來突變數(shù)組,但應(yīng)用突變將需要構(gòu)建新的數(shù)組數(shù)據(jù)結(jié)構(gòu)。
  • 數(shù)組可重定位(例如,用于RPC /瞬態(tài)存儲),無需調(diào)整指針。另一種方法是連續(xù)的內(nèi)存區(qū)域可以遷移到不同的地址空間(例如通過memcpy類型的操作),而不改變它們的內(nèi)容。

    目標(biāo)(對于本文檔)

  • 描述相對類型,足夠的明確的描述實(shí)現(xiàn)(物理值類型和一組初始嵌套類型)
  • 每個相對類型的內(nèi)存布局和隨機(jī)訪問模式
  • 空值表示

    非目標(biāo)(對于本文檔)

  • 枚舉或指定可以實(shí)現(xiàn)為基本(固定寬度)值類型的邏輯類型。例如:有符號和無符號整數(shù),浮點(diǎn)數(shù),布爾值,精確小數(shù),日期和時間類型,CHAR(K),VARCHAR(K)等。
  • 指定標(biāo)準(zhǔn)化元數(shù)據(jù)或RPC或臨時文件存儲的數(shù)據(jù)布局。
  • 定義選擇或屏蔽向量(vector)構(gòu)造
  • 實(shí)現(xiàn)具體細(xì)節(jié)
  • 用戶或開發(fā)人員C/C++/Java API的詳細(xì)信息。
  • 任何由表命名的數(shù)組組成的“表”結(jié)構(gòu),每一個都有自己的類型,或任何構(gòu)成數(shù)組的其他結(jié)構(gòu)。
  • 任何內(nèi)存管理或引用計數(shù)子系統(tǒng)
  • 枚舉或指定編碼或壓縮支持的類型

    字節(jié)順序(Endianness)

    默認(rèn)情況下,Arrow格式是低位編址的(將低序字節(jié)存儲在起始地址)。模式元數(shù)據(jù)有一個指明RecordBatches的字節(jié)順序的字段。通常這是生成RecordBatch的系統(tǒng)的字節(jié)順序。主要用例是在具有相同字節(jié)碼的系統(tǒng)之間交換RecordBatches。首先,當(dāng)嘗試讀取與底層系統(tǒng)不匹配的字節(jié)順序的模式時,將會返回錯誤。參考實(shí)現(xiàn)集中在地位編址,并為此提供測試。最終我們可以通過字節(jié)交換來提供自動轉(zhuǎn)換。

    對齊和填充

    如上所述,所有緩沖區(qū)都旨在以64字節(jié)邊界為準(zhǔn)對齊內(nèi)存,并且填充到64字節(jié)倍數(shù)的長度。對齊要求遵循優(yōu)化內(nèi)存訪問的最佳做法:

  • 數(shù)值數(shù)組中的元素將保證通過對齊的訪問來讀取。
  • 在一些架構(gòu)上,對齊可以幫助限制部分使用的緩存行。
  • 64字節(jié)對齊由英特爾性能向?qū)槌^64個字節(jié)的數(shù)據(jù)結(jié)構(gòu)所推薦的(這將是Arrow格式數(shù)組的共同情況)。
    要求填充64個字節(jié)的倍數(shù)允許在循環(huán)中一致地使用SIMD指令,無需額外的條件檢查。這樣就允許更簡單和更有效的代碼。
    選擇特定的填充長度是因?yàn)樗c2016年4月可用的大的已知SIMD指令寄存器匹配(Intel AVX-512)。保證填充也可以允許某些編譯器直接生成更優(yōu)化的代碼(例如可以安全地使用英特爾 -qopt-assume-safe-padding)。
    除非另有說明,填充字節(jié)不需要具有特定值。

    數(shù)組長度

    任何數(shù)組具有已知且固定長度,存儲為32位有符號整數(shù),因此最多可以存儲(2^31 - 1)個元素。我們選擇一個有符號的int32有一下2個原因:

  • 增強(qiáng)與Java和客戶端語言的兼容性,可能對無符號整數(shù)具有不同的支持質(zhì)量。
  • 為了鼓勵開發(fā)人員組成較小的數(shù)組(每個數(shù)組在其葉節(jié)點(diǎn)中都包含連續(xù)的內(nèi)存),以創(chuàng)建可能超過(2^31- 1)個元素的更大數(shù)組結(jié)構(gòu),而不是分配非常大的連續(xù)內(nèi)存塊。

    空值計數(shù)

    空值槽的數(shù)量是物理數(shù)組的屬性,并被認(rèn)為是數(shù)據(jù)結(jié)構(gòu)的一部分??罩涤嫈?shù)存儲為32位有符號整數(shù),因?yàn)樗赡芘c數(shù)組長度一樣大。

    空值位圖

    任何相對類型都可以有空值槽,不管是原始類型還是嵌套類型。
    具有空值的數(shù)組必須具有連續(xù)的內(nèi)存緩沖區(qū),稱為空(或有效)位圖,其長度為64字節(jié)的倍數(shù)(如上所述),并且足夠大,以至于每個數(shù)組槽至少有1位。
    任何數(shù)組槽是否有效(非空)是在該位圖的各個位中編碼的。索引(設(shè)置位)j值為1表示該值不為空,而0(位未設(shè)置)表示該值為空。位圖被初始化為在分配時間全部未設(shè)置(這包括填充)。
    is_valid[j] -> bitmap[j / 8] & (1 << (j % 8))
    我們使用最低有效位(LSB)編號(也稱為位編址bit-endianness)。這意味著在一組8個位中,我們從右到左讀:

    values = [0, 1, null, 2, null, 3]
    bitmap
    j mod 8   7  6  5  4  3  2  1  0
               0  0  1  0  1  0  1  1

    具有0空值計數(shù)的數(shù)組可以選擇不分配空值位圖。實(shí)現(xiàn)為了方便可能會選擇始終分配一個空值位圖,但是在內(nèi)存被共享時應(yīng)該注意。
    嵌套類型數(shù)組具有自己的空值位圖和空值計數(shù),而不管其子數(shù)組的空值和空位。

    原始(基本)類型值數(shù)組

    基本類型值數(shù)組表示固定長度的數(shù)組,每個值都具有通常用字節(jié)測量的相同的物理槽寬度,盡管規(guī)范還提供了位打包類型(例如以位編碼的布爾值)。
    在內(nèi)部,數(shù)組包含一個連續(xù)的內(nèi)存緩沖區(qū),其總大小等于槽寬乘以數(shù)組長度。對于打包類型,大小將舍入到最接近的字節(jié)。
    關(guān)聯(lián)的空值位圖被連續(xù)分配(如上所述),但不需要在內(nèi)存中與值緩沖器相鄰。

    示例布局:Int32數(shù)組

    例如int32的原始數(shù)組:

    [1,2,null,4,8]

會像:

* Length: 5, Null count: 1
* Null bitmap buffer:

  |Byte 0 (validity bitmap) \| Bytes 1-63           |
  |-------------------------|-----------------------|
  |00011011                 | 0 (padding)          |

* Value Buffer:

  |Bytes 0-3 | Bytes 4-7 | Bytes 8-11| Bytes 12-15| Bytes 16-19 | Bytes 20-63 |
  |----------|-----------|-----------|-----------|-------------|-------------|
  | 1        | 2         | unspecified| 4        | 8           | unspecified |

示例布局:非空int32數(shù)組

[1,2,3,4,8]有兩種可能的布局:

* Length: 5, Null count: 0
* Null bitmap buffer:

  | Byte 0 (validity bitmap) | Bytes 1-63            |
  |--------------------------|-----------------------|
  | 00011111                 | 0 (padding)           |

* Value Buffer:

  |Bytes 0-3 | Bytes 4-7| Bytes 8-11| bytes 12-15 | bytes 16-19 | Bytes 20-63 |
  |---------|----------|------------|-------------|-------------|-------------|
  | 1       | 2        | 3          | 4           | 8           | unspecified |
或者位圖消失:
* Length 5, Null count: 0
* Null bitmap buffer: Not required
* Value Buffer:

  |Bytes 0-3 | Bytes 4-7 | Bytes 8-11| bytes 12-15 | bytes 16-19| Bytes 20-63 |
  |---------|-----------|------------|-------------|------------|-------------|
  | 1       | 2         | 3          | 4           | 8          | unspecified |

列表類型

列表是一種嵌套類型,其中每個數(shù)組槽都包含一個可變大小的值序列,它們都具有相同的相對類型(異質(zhì)性可以通過聯(lián)合實(shí)現(xiàn),稍后描述)。
列表類型被指定為List<T>,這里的T是任何相對類型(原始或嵌套)。
列表數(shù)組由以下組合表示:

  • 值數(shù)組,T類型的子數(shù)組,T也可以是嵌套類型。
  • 一個包含長度等于頂級數(shù)組長度加1的32位有符號整數(shù)的偏移緩沖區(qū)。請注意,這將數(shù)組的大小限制為(2^31 -1)。
    偏移數(shù)組對值數(shù)組中的起始位置進(jìn)行編碼,并且使用與偏移數(shù)組中的下一個元素的第一個差異來計算每個槽中的值的長度。例如。槽j的位置和長度計算為:
    slot_position = offsets[j]
    slot_length = offsets[j + 1] - offsets[j]  // (for 0 <= j < length)

    偏移數(shù)組中的第一個值為0,最后一個元素是值數(shù)組的長度。

    示例布局:List<Char>數(shù)組

      我們來看一個例子,List<Char>類型:其中Char是一個1字節(jié)的邏輯類型。
    對于具有相應(yīng)值的長度為4的數(shù)組:

    [['j','o','e'],null,['m','a','r','k'],[]]

    將具有以下表示:

* Length: 4, Null count: 1
* Null bitmap buffer:

  | Byte 0 (validity bitmap) | Bytes 1-63            |
  |--------------------------|-----------------------|
  | 00001101                 | 0 (padding)           |

* Offsets buffer (int32)

  | Bytes 0-3  | Bytes 4-7   | Bytes 8-11  | Bytes 12-15 | Bytes 16-19 | Bytes 20-63 |
  |------------|-------------|-------------|-------------|-------------|-------------|
  | 0          | 3           | 3           | 7           | 7           | unspecified |

* Values array (char array):
  * Length: 7,  Null count: 0
  * Null bitmap buffer: Not required

    | Bytes 0-6  | Bytes 7-63  |
    |------------|-------------|
    | joemark    | unspecified |

示例布局: List<List<byte>>

[[[1,2],[3,4]],[[5,6,7],null,[8]],[[9,10]]]

將被表示如下:

* Length 3
* Nulls count: 0
* Null bitmap buffer: Not required
* Offsets buffer (int32)

  | Bytes 0-3  | Bytes 4-7  | Bytes 8-11 | Bytes 12-15 | Bytes 16-63 |
  |------------|------------|------------|-------------|-------------|
  | 0          |  2         |  5         |  6          | unspecified |

* Values array (`List<byte>`)
  * Length: 6, Null count: 1
  * Null bitmap buffer:

    | Byte 0 (validity bitmap) | Bytes 1-63  |
    |--------------------------|-------------|
    | 00110111                 | 0 (padding) |

  * Offsets buffer (int32)

    | Bytes 0-27           | Bytes 28-63 |
    |----------------------|-------------|
    | 0, 2, 4, 7, 7, 8, 10 | unspecified |

  * Values array (bytes):
    * Length: 10, Null count: 0
    * Null bitmap buffer: Not required

      | Bytes 0-9                     | Bytes 10-63 |
      |-------------------------------|-------------|
      | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 | unspecified |

結(jié)構(gòu)體類型

  一個struct是一個嵌套類型,它被一個有序序列的相對類型(可以都是不同的)參數(shù)化,相對類型稱為它的字段。
  通常,這些字段具有名稱,但名稱及其類型是元數(shù)據(jù)類型的一部分,而不是物理內(nèi)存布局。
  一個struct數(shù)組沒有為它的值分配任何額外的物理存儲。如果結(jié)構(gòu)體數(shù)組有一個或多個空值,則它必須具有分配的空值位圖。
  在物理上,一個struct類型中每個字段都有一個子數(shù)組。
例如,struct(這里顯示為字符串的字段名稱用于說明)

Struct <
  name: String (= List<char>),
  age: Int32
>

有兩個子數(shù)組,一個列表 數(shù)組(如上所示)和一個具有Int32邏輯類型的4字節(jié)的基本類型數(shù)組。

示例布局Struct<List<char>, Int32>:

[{'joe',1},{null,2},null,{'mark',4}]的布局將是:

* Length: 4, Null count: 1
* Null bitmap buffer:

  |Byte 0 (validity bitmap) | Bytes 1-63            |
  |-------------------------|-----------------------|
  | 00001011                | 0 (padding)           |

* Children arrays:
  * field-0 array (`List<char>`):
    * Length: 4, Null count: 2
    * Null bitmap buffer:

      | Byte 0 (validity bitmap) | Bytes 1-63            |
      |--------------------------|-----------------------|
      | 00001001                 | 0 (padding)           |

    * Offsets buffer:

      | Bytes 0-19     |
      |----------------|
      | 0, 3, 3, 3, 7  |

     * Values array:
        * Length: 7, Null count: 0
        * Null bitmap buffer: Not required

        * Value buffer:

          | Bytes 0-6      |
          |----------------|
          | joemark        |

  * field-1 array (int32 array):
    * Length: 4, Null count: 1
    * Null bitmap buffer:

      | Byte 0 (validity bitmap) | Bytes 1-63            |
      |--------------------------|-----------------------|
      | 00001011                 | 0 (padding)           |

    * Value Buffer:

      |Bytes 0-3   | Bytes 4-7   | Bytes 8-11  | Bytes 12-15 | Bytes 16-63 |
      |------------|-------------|-------------|-------------|-------------|
      | 1          | 2           | unspecified | 4           | unspecified |

  雖然結(jié)構(gòu)體沒有為每個語義槽(即每個與C語言樣結(jié)構(gòu)體相似的標(biāo)量)提供物理存儲,但是可以通過空值位圖將整個結(jié)構(gòu)化槽設(shè)置為空。任何子字段數(shù)組可以根據(jù)各自的獨(dú)立空值位圖擁有空值。這意味著對于特定的結(jié)構(gòu)體槽,結(jié)構(gòu)體數(shù)組的空值位圖可能表示一個空槽,當(dāng)其一個或多個子數(shù)組在其相應(yīng)的槽中具有非空值時。讀取結(jié)構(gòu)體數(shù)組時,父空值位圖是權(quán)威的。這在上面的示例中說明,子數(shù)組具有空值結(jié)構(gòu)體的有效實(shí)體,但是由父數(shù)組的空值位圖“隱藏”。但是,獨(dú)立處理時,子數(shù)組的對應(yīng)值將不為空。

密集聯(lián)合(共用體)類型

  密集的聯(lián)合在語義上類似于一個結(jié)構(gòu)體,并且包含相對類型的有序序列。當(dāng)一個結(jié)構(gòu)體包含多個數(shù)組時,一個聯(lián)合語義上是一個單個數(shù)組,其中每個槽可以有一個不同的類型。
 聯(lián)合類型可以被命名,但是像結(jié)構(gòu)體一樣,這將是元數(shù)據(jù)的問題,并且不會影響物理內(nèi)存布局。
 我們定義了針對不同用例優(yōu)化的兩種不同的聯(lián)合類型。首先,密集聯(lián)合,表示每個值為5字節(jié)開銷的混合型數(shù)組。其物理布局如下:
每個相對類型一個子數(shù)組

  • 類型緩沖區(qū):8位有符號整數(shù)的緩沖區(qū),從每個類型對應(yīng)的0列舉。具有多達(dá)127種可能類型的聯(lián)合可以被模擬為多個聯(lián)合中的一個聯(lián)合。
  • 偏移緩沖區(qū):一個帶符號int32值的緩沖區(qū),指明給定槽中類型相應(yīng)子數(shù)組的相對偏移量。每個子值數(shù)組的相應(yīng)偏移必須按順序/增加。
      重要的是,密集的聯(lián)合在普遍的結(jié)合體中,結(jié)合體在無重疊的字段的用例場景下(Union<s1: Struct1, s2: Struct2, s3: Struct3, ...>)允許最小開銷。、

示例布局:密集聯(lián)合

邏輯聯(lián)合的示例布局: Union<f: float, i: int32>具有以下值:[{f = 1.2},null,{f = 3.4},{i = 5}]

* Length: 4, Null count: 1
* Null bitmap buffer:
  |Byte 0 (validity bitmap) | Bytes 1-63            |
  |-------------------------|-----------------------|
  |00001101                 | 0 (padding)           |

* Types buffer:

  |Byte 0   | Byte 1      | Byte 2   | Byte 3   | Bytes 4-63  |
  |---------|-------------|----------|----------|-------------|
  | 0       | unspecified | 0        | 1        | unspecified |

//存的是Union中的索引 f索引為0, i索引為1

* Offset buffer:

  |Byte 0-3 | Byte 4-7    | Byte 8-11 | Byte 12-15 | Bytes 16-63 |
  |---------|-------------|-----------|------------|-------------|
  | 0       | unspecified | 1         | 0          | unspecified |

* Children arrays:
  * Field-0 array (f: float):
    * Length: 2, nulls: 0
    * Null bitmap buffer: Not required

    * Value Buffer:

      | Bytes 0-7 | Bytes 8-63  |
      |-----------|-------------|
      | 1.2, 3.4  | unspecified |

  * Field-1 array (i: int32):
    * Length: 1, nulls: 0
    * Null bitmap buffer: Not required

    * Value Buffer:

      | Bytes 0-3 | Bytes 4-63  |
      |-----------|-------------|
      | 5         | unspecified |

稀疏聯(lián)合類型

  稀疏聯(lián)合與密集聯(lián)合具有相同的結(jié)構(gòu),省略了偏移數(shù)組。在這種情況下,子數(shù)組的長度與union的長度相等。
  雖然與密集聯(lián)合相比,稀疏聯(lián)合可能使用明顯更多的空間,但在某些確定的用例中可能擁有一些優(yōu)點(diǎn):

  • 在一些用例中,稀疏聯(lián)合更適合向量化表達(dá)式求值。
  • 通過僅定義types數(shù)組,等長數(shù)組可以解釋為聯(lián)合。

    示例布局: SparseUnion<u0: Int32, u1: Float, u2: List<Char>>

    對于聯(lián)合數(shù)組:
    [{u0 = 5},{u1 = 1.2},{u2 ='joe'},{u1 = 3.4},{u0 = 4},{u2 ='mark'}]
    將具有以下布局:

* Length: 6, Null count: 0
* Null bitmap buffer: Not required

* Types buffer:

 | Byte 0     | Byte 1      | Byte 2      | Byte 3      | Byte 4      | Byte 5       | Bytes  6-63           |
 |------------|-------------|-------------|-------------|-------------|--------------|-----------------------|
 | 0          | 1           | 2           | 1           | 0           | 2            | unspecified (padding) |

* Children arrays:

  * u0 (Int32):
    * Length: 6, Null count: 4
    * Null bitmap buffer:

      |Byte 0 (validity bitmap) | Bytes 1-63            |
      |-------------------------|-----------------------|
      |00010001                 | 0 (padding)           |

    * Value buffer:

      |Bytes 0-3   | Bytes 4-7   | Bytes 8-11  | Bytes 12-15 | Bytes 16-19 | Bytes 20-23  | Bytes 24-63           |
      |------------|-------------|-------------|-------------|-------------|--------------|-----------------------|
      | 5          | unspecified | unspecified | unspecified | 4           |  unspecified | unspecified (padding) |

  * u1 (float):
    * Length: 6, Null count: 4
    * Null bitmap buffer:

      |Byte 0 (validity bitmap) | Bytes 1-63            |
      |-------------------------|-----------------------|
      | 00001010                | 0 (padding)           |

    * Value buffer:

      |Bytes 0-3    | Bytes 4-7   | Bytes 8-11  | Bytes 12-15 | Bytes 16-19 | Bytes 20-23  | Bytes 24-63           |
      |-------------|-------------|-------------|-------------|-------------|--------------|-----------------------|
      | unspecified |  1.2        | unspecified | 3.4         | unspecified |  unspecified | unspecified (padding) |

  * u2 (`List<char>`)
    * Length: 6, Null count: 4
    * Null bitmap buffer:

      | Byte 0 (validity bitmap) | Bytes 1-63            |
      |--------------------------|-----------------------|
      | 00100100                 | 0 (padding)           |

    * Offsets buffer (int32)

      | Bytes 0-3  | Bytes 4-7   | Bytes 8-11  | Bytes 12-15 | Bytes 16-19 | Bytes 20-23 | Bytes 24-27 | Bytes 28-63 |
      |------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|
      | 0          | 0           | 0           | 3           | 3           | 3           | 7           | unspecified |

    * Values array (char array):
      * Length: 7,  Null count: 0
      * Null bitmap buffer: Not required

        | Bytes 0-7  | Bytes 8-63            |
        |------------|-----------------------|
        | joemark    | unspecified (padding) |

  請注意,稀疏聯(lián)合中的嵌套類型必須在內(nèi)部一致(例如,見圖中的列表),即任何子數(shù)組上任何索引j的隨機(jī)訪問都不會導(dǎo)致錯誤。換句話說,嵌套類型的數(shù)組如果被重新解釋為非嵌套數(shù)組,則必須是有效的。
  與結(jié)構(gòu)類似,特定的子數(shù)組可能具有非空槽,即使父聯(lián)合數(shù)組的空值位圖表示槽為空。此外,即使類型數(shù)組指示槽在索引處包含不同類型,子數(shù)組也可能具有非空槽。

字典編碼

  當(dāng)字段被字典編碼時,這些值由表示字典中值的索引的Int32數(shù)組表示。字典被收錄為DictionaryBatch,它的id由字段表中的元數(shù)據(jù)(Message.fbs)中定義的字典屬性引用。字典具有與字段類型相同的布局。字典中的每個實(shí)體都可以通過其DictionaryBatch中的索引來訪問。當(dāng)Schema引用Dictionary id時,它必須在任何RecordBatch之前為此id發(fā)送DictionaryBatch。
例如,您可以獲得以下數(shù)據(jù):

type: List<String>

[
 ['a', 'b'],
 ['a', 'b'],
 ['a', 'b'],
 ['c', 'd', 'e'],
 ['c', 'd', 'e'],
 ['c', 'd', 'e'],
 ['c', 'd', 'e'],
 ['a', 'b']
]

在字典編碼的形式中,這可能顯示為:

data List<String> (dictionary-encoded, dictionary id i)
indices: [0, 0, 0, 1, 1, 1, 0]
//['a','b']為字典值,索引為0;['c', 'd', 'e']為字典值,索引為2

dictionary i

type: List<String>

[
 ['a', 'b'],
 ['c', 'd', 'e'],
]

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

標(biāo)題名稱:ApacheArrow官方文檔-內(nèi)存結(jié)構(gòu)-創(chuàng)新互聯(lián)
文章來源:http://muchs.cn/article44/deodhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、移動網(wǎng)站建設(shè)全網(wǎng)營銷推廣、網(wǎng)站內(nèi)鏈企業(yè)建站、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)