984
財經資訊
寬行讀取__最佳實踐_表格存儲-阿裏雲
本節介紹表格存儲中的寬行流式讀功能,即如何讀取一個有很多列和很大數據量的行、當一次讀取不出整行時如何分多次讀取或者當隻需要讀取寬行的一部分時如何讀取性能可以更好。
寬行與寬行流式讀
表格存儲的表每行由主鍵列和屬性列構成,主鍵列按照順序構成一個主鍵,是可以確定行的唯一標識。讀/寫某一行時,我們必須指定這一行的主鍵,然後寫入或者讀取其中的某些屬性列。
主鍵列的名稱和類型是在建表時確定好的,為 TableMeta 的一部分。但是屬性列的列名和數量卻是不需要指定的,在實際寫入某一行時可以任意設置寫入的屬性列的列名,隻要符合一定的字符集限製即可。
表格存儲從存儲機製和讀/寫接口上支持寬行,所以不會限製總共的屬性列數量和每行的大小,這也是相比傳統數據庫的很大優勢。寬行一般而言就是指擁有非常多列的行,這樣一行就會很寬,而且一行總大小很大。比如,反複對同一行寫入一些新的列,最終就會產生一個很寬的行。因為每次隻寫入一小部分數據到一個寬行,所以寫入性能不是問題,問題在於讀取。假如一行數據很大,一次無法讀出整行。若要讀取整行,可以先讀取這一行的一部分列,再接著讀後麵的列,分多次讀取就可以,這就是寬行流式讀功能(需要使用 4.0.0 以上版本 Java SDK)。
寬行讀取方式
寬行讀取有以下幾種方式:
使用 startColumn 和 endColumn 讀取一定範圍的屬性列。
在 GetRow 的參數中,可以通過 startColumn 和 endColumn 指定要查詢的屬性列的起始和終止範圍(按照字典序比較),這樣可以讀取一個寬行中的一定列名範圍內的列。
// 讀一行
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
// 設置讀取的列的範圍
criteria.setStartColumn("Col00000");
criteria.setEndColumn("Col10000");
// 設置讀取最新版本
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
使用 ColumnPaginationFilter 配合 startColumn 參數。
ColumnPaginationFilter 有 limit 和 offset 兩個參數。使用 ColumnPaginationFilter 讀取時,會跳過 offset 個屬性列,然後讀取 limit 個屬性列。配合 startColumn 使用時,會從 startColumn 開始,跳過 offset 個屬性列,讀取 limit個 屬性列。這種方式適合分頁讀取屬性列的場景。
// 讀一行
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
// 設置從“ColumnX”開始讀
criteria.setStartColumn("ColumnX");
// 使用ColumnPaginationFilter設置一次要讀取的列數, limit=10, offset=0
criteria.setFilter(new ColumnPaginationFilter(10, 0));
// 設置讀取最新版本
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
使用 WideColumnIterator。
使用 SDK 提供的 WideColumnIterator,可以通過迭代器的方式讀取一行中的全部屬性列。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
// 設置讀取最新版本
criteria.setMaxVersions(1);
WideColumnIterator wideColumnIterator = syncClient.createWideColumnIterator(new GetRowRequest(criteria));
System.out.println(wideColumnIterator.getPrimaryKey());
while (wideColumnIterator.hasNextColumn()) {
System.out.println(wideColumnIterator.nextColumn());
}
總結
表格存儲支持自由的屬性列名稱與個數,支持寬行,給業務的表結構設計提供了很高的靈活性。當表中具有寬行時,通常的讀取方式可能不能滿足需求,此時可以選用上述的幾種方式進行寬行的讀取。此外,業務在設計表結構時,如果有寬行需求,也要綜合評估是否可將寬行轉成多個窄行存儲,避免處理寬行讀取問題。
最後更新:2016-12-12 17:07:43
上一篇:
使用過濾器__最佳實踐_表格存儲-阿裏雲
下一篇:
主鍵列自增__最佳實踐_表格存儲-阿裏雲
類型轉換__進階與深入_數據集成-阿裏雲
請求接口__調用方式_API參考_專有網絡 VPC-阿裏雲
sleep示例__示例程序_MapReduce_大數據計算服務-阿裏雲
代金券賬戶消費後是否可以開發票?___代金券_代金券及推薦碼_財務-阿裏雲
斷點續傳上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲
HeadObject__關於Object操作_API 參考_對象存儲 OSS-阿裏雲
更換係統盤__磁盤_用戶指南_雲服務器 ECS-阿裏雲
步驟4:修改DNS解析(可選)__快速入門(非網站業務)_DDoS 高防IP-阿裏雲
PostVodPlaylist__關於LiveChannel的操作_API 參考_對象存儲 OSS-阿裏雲
ALIYUN::SLB::VServerGroup__資源列表_資源編排-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲