1. 用happybase happy地查詢hbase數據
用happybase進行hbase中數據的增刪改查
前提:已經安裝happybase庫(pip install happybase),已有hbase環境並開啟thrift通訊埠(nohup hbase thrift start &),thrift默認埠為9090,10.10.30.200為hbase主機ip
scan方法:
參數:
row_start、row_stop:起始和終止rowkey,查詢兩rowkey間的數據
row_prefix:rowkey前綴。註:使用row_prefix的時候,row_start和row_stop不能使用
filter:要使用的過濾器(hbase 0.92版本及以上生效)
timestamp:按指定時間戳查詢
reverse:默認為False。為True時,scan結果按rowkey倒序排列
e.g:
put方法:
e.g:
△ 如put中的rowkey已存在,則為修改數據
delete方法:
row:刪除rowkey為row的數據
columns:指定columns參數時,刪除
e.g:
刪除rowkey為student2的name數據:
刪除成功:
batch方法:
1、批量操作
2、使用with管理批量
row方法及rows()方法,檢索指定rowkey的數據
檢索一條:
檢索多條:
返回結果:
e.g:
結果:
暫時就這些0v0
2. hbase 命令如何查是否有rowkey為空的值
不要用這個,hbase查詢的時候可以設start和end。還有一個是可以根據offset查。用正規能搞死你,一定要提前設計好自己的key。否則數據海量的時候有你受的。
3. hbase如何根據某個列的值,查詢出這個列的ro
剛才理解錯了,你是要在C列顯示對應A列的B列值,修改一下答案
在c列第一個單元格C1復制如下公式:
=VLOOKUP(A1,sheet1!$A$1:$B$n,2,0)
其中n為A列最後一個單元格行數
然後把B1向下填充到其他B列單元格,公示應該會自動變為
=VLOOKUP(A2,sheet1!$A$1:$B$n,2,0)
=VLOOKUP(A3,sheet1!$A$1:$B$n,2,0)
......
=VLOOKUP(An,sheet1!$A$1:$B$n,2,0)
這樣應該可行,我沒試驗過你這種情況。你應該仔細看看VLOOKUP()這個函數的用法
下面是我給別人寫的,不過對方說沒看懂,你看看:
如果你有一個數據表,而另一個表格需要自動讀取這個數據表內的數據,函數VLOOKUP()就很有用了。
下面簡單說一下:
函數VLOOKUP()用法:
例子 公式如下
=VLOOKUP(F5,Sheet2!$F$4:$W$957,2,0)
其中第一個參數F5為查找值,即使用該公式的單元格內的數據是根據F5單元格內的數據查找出來的,例如你把姓名放在F列,其中F5是一個叫張三的人,G列是身份證號。G5要查找張三的身份證號,就可以在G5用函數VLOOKUP()
第二個參數是數據表,就是由哪一個數據表的哪幾列數據為查找范圍,【Sheet2!】就是數據表名,$F$4(F4)就是范圍的左上角單元格,$W$957(W957)就是右下角單元格,查找范圍就是在這個矩形內。其中F列數據必須是第一個參數F5的比照列,簡單來說就是第一個參數F5的數值應該在查找的數據表的F列內。且F列必須是查找范圍的第一個列該公式才起作用。舉例你要查找張三,那麼張三在Sheet2數據表查找范圍內的所在列必須是查找范圍內的第一列。F4寫成$F$4是為了固定該單元格,否則在復制公式的時候excel會自動遞加單元格數值,F4在復制的時候可能會變成F5、F6...,造成查找范圍改變
第三個參數是列數,就是該函數返回的是第幾列的數值,該列數是相對列數,即查找范圍內的第幾列。例如Sheet2工作表內的F列在整個表格內屬於第6列,但在查找范圍內的相對列數是第1列。假如張三的身份證在G列內,那麼就是返回查找范圍的第二列。
第四個參數是匹配條件,一般為0。
下面舉一個具體使用的例子。
假設你有一個excel文件,裡面的sheet1工作表記錄的是單位人員姓名及人員身份證號,你現在需要創建一個新excel文件,記錄單位人員的三險一金,裡面需要輸入人員的身份證號,如果再一個一個輸入,重復勞動效率低不說,很有可能輸錯了,這時候你就可以從以前那個excel文件中讀取這些人員的身份證號。
在新表中先輸入人員姓名(如果你用人員序號作比對的話,姓名也可以自動讀取),然後在需要輸入身份證號的地方點擊上面的【fx】,出現【插入函數】的對話框,在類別中選擇【查找和引用】,最後一個就是VLOOKUP,選中它,點【確定】,然後出現【函數參數】對話框,【Lookup-value】為第一個參數,點擊旁邊的表格紅箭頭圖標,選中新表中需要查找身份證號的那個人的姓名單元格;【table-array】為第二個參數,顧名思義是表格數組,包含行列的一個范圍,就是查找范圍,點擊旁邊表格紅箭頭圖標,在老表sheet1中框選所有姓名和身份證號,保證老表中姓名在第一列;【col-index-num】為第三個參數,看看老表中身份證號在選擇范圍是第幾列,就寫上幾。假如老表內身份證號緊跟著姓名,因為姓名列是范圍內的第一列,那麼身份證號就是第二列;【range-lookup】為第四個參數,寫上0。全部弄好以後,回到新表看看身份證號是不是已經自動讀出來了。如果沒有一是查查這個人在老表中有沒有,名字有沒有空格,還有你選擇的第三個參數列數對不對,注意有沒有隱藏列,因為隱藏列雖然看不到,但是也計算在列數裡面。如果沒問題,將公示復制到所有需要讀取身份證的單元格內。
這樣有一個問題,因為你新表讀取的是文件外的數據,所以必須保證老表文件位置不能變動,否則新表就不知道去哪裡找數據了。解決方法有三個,一是保證老表文件位置永遠不動(廢話);二是在操作前先把老表數據復制到新表所在的文件內,單獨作為一個sheet工作表存在,然後再查找新表復制後的數據,因為在同一個文件內,不用擔心數據源丟失問題;三是不復制老表,新表讀取數據後,選中讀取的數據,點擊【復制】,然後在原位置點擊【選擇性粘貼】,選中粘貼【數據】,這樣公式會被公式讀取的數據覆蓋,就和數據源沒有關系了。
還會遇到一個問題,如果老表沒有數據,比如說老表內李四這個人當時就沒有輸入身份證號,那麼新表內李四用公式查出來的身份證號並不是空,而是0,解決這個問題需要加一個if判斷語句,如下:
=IF(你的公式=0,"",你的原公式)
還有就是,如果數據查找出錯,會出現#N/A或者#VALUE,也可以用if語句取消,如下:
=IF(ISERROR(你的公式),"",你的公式)
不過不建議這樣做,有錯誤提示才能知道去查找公式是不是有問題,公式沒問題自然不會出現錯誤提示,沒必要人為取消。
4. HBase怎樣進行部分rowKey的范圍查詢
如果前面的xxx_xxx_xxx_沒有什麼規握敏律的話,只能段帶枝用Scan+Filter實現了,如果rowkey前面部分有規律的話,能使用startRow和行盯endRow是最好的
5. HBase條件查詢(多條件查詢)
轉 https://blog.csdn.net/PirateLeo/article/details/7956965
文中可能涉及到的API:
Hadoop/HDFS: http://hadoop.apache.org/common/docs/current/api/
HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html
Begin!
HBase的查詢實現只提供兩種方式:
1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get)
2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan)
實現條件查詢功能使用的就是scan方式,scan在使用時有以下幾點值得注意:
1、scan可以通過setCaching與setBatch方法提高速度(以空間換時間);
2、scan可以通過setStartRow與setEndRow來限定范圍。范圍越小,性能越高。
通過巧妙的RowKey設計使我們批量獲取記錄集合中的元素挨在一起(應該在同一個Region下),可以在遍歷結果時獲得很好的性能。
3、scan可以通過setFilter方法添加過濾器,這也是分頁、多條件查詢的基礎。
下面舉個形象的例子:
我們在表中存儲的是文件信息,每個文件有5個屬性:文件id(long,全局唯一)、創建時間(long)、文件名(String)、分類名(String)、所有者(User)。
我們可以輸入的查詢條件:文件創建時間區間(比如從20120901到20120914期間創建的文件),文件名(「中國好聲音」),分類(「綜藝」),所有者(「浙江衛視」)。
假設當前我們一共有如下文件:
內容列表
ID CreateTime Name Category UserID
1 20120902 中國好聲音第1期 綜藝 1
2 20120904 中國好聲音第2期 綜藝 1
3 20120906 中國好聲音外卡賽 綜藝 1
4 20120908 中國好聲音第3期 綜藝 1
5 20120910 中國好聲音第4期 綜藝 1
6 20120912 中國好聲音選手采訪 綜藝花絮 2
7 20120914 中國好聲音第5期 綜藝 1
8 20120916 中國好聲音錄制花絮 綜藝花絮 2
9 20120918 張瑋獨家專訪 花絮 3
10 20120920 加多寶涼茶廣告 綜藝廣告 4
這里UserID應該對應另一張User表,暫不列出。我們只需知道UserID的含義:
1代表 浙江衛視; 2代表 好聲音劇組; 3代表 XX微博; 4代表 贊助商。
調用查詢介面的時候將上述5個條件同時輸入find(20120901,20121001,"中國好聲音","綜藝","浙江衛視")。
此時我們應該得到記錄應該有第1、2、3、4、5、7條。第6條由於不屬於「浙江衛視」應該不被選中。
我們在設計RowKey時可以這樣做:採用UserID + CreateTime + FileID組成rowKey,這樣既能滿足多條件查詢,又能有很快的查詢速度。
需要注意以下幾點:
1、每條記錄的RowKey,每個欄位都需要填充到相同長度。假如預期我們最多有10萬量級的用戶,則userID應該統一填充至6位,如000001,000002...
2、結尾添加全局唯一的FileID的用意也是使每個文件對應的記錄全局唯一。避免當UserID與CreateTime相同時的兩個不同文件記錄相互覆蓋。
按照這種RowKey存儲上述文件記錄,在HBase表中是下面的結構:
rowKey(userID 6 + time 8 + fileID 6) name category ....
00000120120902000001
00000120120904000002
00000120120906000003
00000120120908000004
00000120120910000005
00000120120914000007
00000220120912000006
00000220120916000008
00000320120918000009
00000420120920000010
怎樣用這張表?
在建立一個scan對象後,我們setStartRow(00000120120901),setEndRow(00000120120914)。
這樣,scan時只掃描userID=1的數據,且時間范圍限定在這個指定的時間段內,滿足了按用戶以及按時間范圍對結果的篩選。並且由於記錄集中存儲,性能很好。
然後使用SingleColumnValueFilter(org.apache.hadoop.hbase.filter.SingleColumnValueFilter),共4個,分別約束name的上下限,與category的上下限。滿足按同時按文件名以及分類名的前綴匹配。
(注意:使用SingleColumnValueFilter會影響查詢性能,在真正處理海量數據時會消耗很大的資源,且需要較長的時間。
在後續的博文中我將多舉幾種應用場景下rowKey的,可以滿足簡單條件下海量數據瞬時返回的查詢功能)
如果需要分頁還可以再加一個PageFilter限制返回記錄的個數。
以上,我們完成了高性能的支持多條件查詢的HBase表結構設計。