本篇文章介紹表格存儲中的寬行流式讀功能,簡單說就是介紹如何讀取一個列很多資料量很大的行,當一次讀取不出整行時如何分多次讀取,當隻需要讀取寬行的一部分時如何讀取可以性能更好。
表格存儲的表結構設計中,每行由主鍵列和屬性列構成,主鍵列按照順序構成一個主鍵,唯一的确定一行。讀寫某一行時,我們必須指定這一行的主鍵,然後寫入或者讀取其中的某些屬性列。
主鍵列的名稱和類型是在建表時确定好的,作為tablemeta的一部分。但是屬性列的列名和數量卻是不需要指定的,在實際寫入某一行時可以任意設定寫入的屬性列的列名,隻要符合一定的字元集限制。
<b>那麼一行總共的屬性列數量有沒有限制呢?每行的大小是否有限制呢?答案是不限制,因為表格存儲從存儲機制和讀寫接口上支援寬行,這也是相比傳統資料庫的很大優勢。</b> 寬行一般而言就是指擁有非常多列的行,這樣一行就會很寬,而且一行總大小很大。比如我們反複對同一行寫入一些新的列,最終就會産生一個很寬的行。因為每次我們隻寫入一小部分資料到一個寬行,是以寫入性能不是問題,問題在于讀取。假如一行資料很大,我們是一次讀不出整行的。那麼要讀取整行怎麼辦,可以想到假如可以先讀取這一行的一部分列,再接着讀後面的列,分多次讀取就好了。這就是寬行流式讀功能(需要使用4.0.0以上版本java sdk)。
下面具體來介紹一下寬行的幾種讀取方式。
在getrow的參數中,可以通過startcolumn和endcolumn指定要查詢的屬性列的起始和終止範圍(按照字典序比較),這樣可以讀取一個寬行中的一定列名範圍的列。
columnpaginationfilter有兩個參數,limit和offset,使用columnpaginationfilter讀取時,會跳過offset個屬性列,然後讀取limit個屬性列。配合startcolumn使用時,會從startcolumn開始,跳過offset個屬性列,讀取limit個屬性列。這種方式适合分頁讀取屬性列的場景。
使用sdk提供的widecolumniterator,可以通過疊代器的方式讀取一行中的全部屬性列,sdk内部會流式擷取。
表格存儲支援自由的屬性列名稱與個數,支援寬行,給業務的表結構設計提供了很高的靈活性。當表中具有寬行時,通常的讀取方式可能不能滿足需求,此時可以選用上述的幾種方式進行寬行的讀取。此外,業務在設計表結構時,如果有寬行需求,也要綜合評估是否可将寬行轉成多個窄行存儲,避免處理寬行讀取問題。