閱讀984 返回首頁    go 財經資訊


寬行讀取__最佳實踐_表格存儲-阿裏雲

本節介紹表格存儲中的寬行流式讀功能,即如何讀取一個有很多列和很大數據量的行、當一次讀取不出整行時如何分多次讀取或者當隻需要讀取寬行的一部分時如何讀取性能可以更好。

寬行與寬行流式讀

表格存儲的表每行由主鍵列和屬性列構成,主鍵列按照順序構成一個主鍵,是可以確定行的唯一標識。讀/寫某一行時,我們必須指定這一行的主鍵,然後寫入或者讀取其中的某些屬性列。

主鍵列的名稱和類型是在建表時確定好的,為 TableMeta 的一部分。但是屬性列的列名和數量卻是不需要指定的,在實際寫入某一行時可以任意設置寫入的屬性列的列名,隻要符合一定的字符集限製即可。

表格存儲從存儲機製和讀/寫接口上支持寬行,所以不會限製總共的屬性列數量和每行的大小,這也是相比傳統數據庫的很大優勢。寬行一般而言就是指擁有非常多列的行,這樣一行就會很寬,而且一行總大小很大。比如,反複對同一行寫入一些新的列,最終就會產生一個很寬的行。因為每次隻寫入一小部分數據到一個寬行,所以寫入性能不是問題,問題在於讀取。假如一行數據很大,一次無法讀出整行。若要讀取整行,可以先讀取這一行的一部分列,再接著讀後麵的列,分多次讀取就可以,這就是寬行流式讀功能(需要使用 4.0.0 以上版本 Java SDK)。

寬行讀取方式

寬行讀取有以下幾種方式:

  • 使用 startColumn 和 endColumn 讀取一定範圍的屬性列。

    在 GetRow 的參數中,可以通過 startColumn 和 endColumn 指定要查詢的屬性列的起始和終止範圍(按照字典序比較),這樣可以讀取一個寬行中的一定列名範圍內的列。

    1. // 讀一行
    2. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
    3. // 設置讀取的列的範圍
    4. criteria.setStartColumn("Col00000");
    5. criteria.setEndColumn("Col10000");
    6. // 設置讀取最新版本
    7. criteria.setMaxVersions(1);
    8. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    9. Row row = getRowResponse.getRow();
  • 使用 ColumnPaginationFilter 配合 startColumn 參數。

    ColumnPaginationFilter 有 limit 和 offset 兩個參數。使用 ColumnPaginationFilter 讀取時,會跳過 offset 個屬性列,然後讀取 limit 個屬性列。配合 startColumn 使用時,會從 startColumn 開始,跳過 offset 個屬性列,讀取 limit個 屬性列。這種方式適合分頁讀取屬性列的場景。

    1. // 讀一行
    2. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
    3. // 設置從“ColumnX”開始讀
    4. criteria.setStartColumn("ColumnX");
    5. // 使用ColumnPaginationFilter設置一次要讀取的列數, limit=10, offset=0
    6. criteria.setFilter(new ColumnPaginationFilter(10, 0));
    7. // 設置讀取最新版本
    8. criteria.setMaxVersions(1);
    9. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    10. Row row = getRowResponse.getRow();
  • 使用 WideColumnIterator。

    使用 SDK 提供的 WideColumnIterator,可以通過迭代器的方式讀取一行中的全部屬性列。

    1. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
    2. // 設置讀取最新版本
    3. criteria.setMaxVersions(1);
    4. WideColumnIterator wideColumnIterator = syncClient.createWideColumnIterator(new GetRowRequest(criteria));
    5. System.out.println(wideColumnIterator.getPrimaryKey());
    6. while (wideColumnIterator.hasNextColumn()) {
    7. System.out.println(wideColumnIterator.nextColumn());
    8. }

總結

表格存儲支持自由的屬性列名稱與個數,支持寬行,給業務的表結構設計提供了很高的靈活性。當表中具有寬行時,通常的讀取方式可能不能滿足需求,此時可以選用上述的幾種方式進行寬行的讀取。此外,業務在設計表結構時,如果有寬行需求,也要綜合評估是否可將寬行轉成多個窄行存儲,避免處理寬行讀取問題。

最後更新:2016-12-12 17:07:43

  上一篇:go 使用過濾器__最佳實踐_表格存儲-阿裏雲
  下一篇:go 主鍵列自增__最佳實踐_表格存儲-阿裏雲