Hbase过滤查询

转载于:http://chengjianxiaoxue.iteye.com/blog/2312179

list 查看表 带有正则写法:

 Java代码  收藏代码

  1. hbase(main):014:0> list 'zm.*'  
  2. TABLE                                                                                                                      
  3. zmtest1                                                                                                                    
  4. 1 row(s) in 0.0060 seconds  
  5.   
  6. => ["zmtest1"]  

 

如下是案例中总结出来的命令:

 

Java代码  
收藏代码
  1. rowkey: PrefixFilter  
  2. 列名:ColumnPrefixFilter  
  3. 列值:ValueFilter (精确/模糊)   
  4.       ValueFilter(>,'binary:\x00\x00\x00\x00\x00\x00\x00\x0F')  
  5.       ValueFilter(=,'binary:sku188')  
  6.       ValueFilter(=,'substring:1')  
  7.       可以结合limit使用  LIMIT => 10  
  8.         scan 'zmtest1', LIMIT => 10, FILTER=>"( ColumnPrefixFilter('app') AND ValueFilter(>,'binary:\x00\x00\x00\x00\x00\x00\x00\x0F') )"  
  9.         scan 'zmtest1', LIMIT => 10  查看10条记录   
  10.           <span style="">FirstKeyOnlyFilter: 只获取hbase表第一个列和对应value值  
  11.           RowFilter: 只获取rowkey  
  12. </span>           
  13. hbase 列值为binary下映射到hive:  
  14. CREATE EXTERNAL TABLE user_app_cookie_list ( username STRING, app1_cookie_id BIGINT, app2_cookie_id BIGINT )  
  15. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  16. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, lf:app1#b, lf:app2#b")  
  17. TBLPROPERTIES("hbase.table.name" = "zmtest1");  
  18.   
  19. 因为下面案例 hbase shell put的值都是二进制,因此在创建hive外表时,需要指定  #b,否则  
  20. 关联后查询的hive列值是null.  
  21.   
  22. 而在案例 <a style="text-decoration: underline; color: #108ac6;" href="/blog/2279407">hbase+hive结合使用</a><span class="Apple-converted-space"><strong><span style="font-size: medium;"> 中</span></strong><span style="font-size: medium;">,因为shell put的数据都是字符串因此创建外表  
  23. 不需要指定格式,曾实验用#b  #s创建hive外表,查询结果都是正确的,  
  24. 估计默认就是#s格式, #b只在hbase shell中显示插入二进制数据时才用到  
  25. </span></span>  
  26.   
  27. -- 增加列族名  
  28. alter 'zmtest1', NAME => 'cf'    
  29. -- 删除列族  
  30. alter 'zmtest1', NAME => 'cf', METHOD => 'delete'  
  31. 或者  
  32. alter 'zmtest1''delete' => 'cf'  

 

 =============如下是案例============================

Java代码  
收藏代码
  1. create 'zmtest1''lf''sf'  
  2.               -- lf: column family of LONG values (binary value)  
  3.               -- sf: column family of STRING values  
  4.                       
  5. -- 一个用户(userX),在什么时间(tsX),作为rowkey  
  6. -- 对什么产品(value:skuXXX),做了什么操作作为列名,比如,c1: click from homepage; c2: click from ad; s1: search from homepage; b1: buy  
  7. put 'zmtest1''user1|ts1''sf:c1''sku1'  -- 向表zmtest1中,rowkey为user1|ts1的记录,添加列族为sf下列名为c1,列值为sku1  
  8. put 'zmtest1''user1|ts2''sf:c1''sku188'  
  9. put 'zmtest1''user1|ts3''sf:s1''sku123'  
  10.   
  11.   
  12. put 'zmtest1''user2|ts4''sf:c1''sku2'  
  13. put 'zmtest1''user2|ts5''sf:c2''sku288'  
  14. put 'zmtest1''user2|ts6''sf:s1''sku222'  
  15.   
  16.   
  17. ====================================hbase shell filter=======================================================  
  18. scan 'zmtest1', FILTER=>"ValueFilter(=,'binary:sku188')"     -- 过滤列值value,  binary表示列值二进制下的精确查找  
  19. hbase(main):012:0> scan 'zmtest1',FILTER=>"ValueFilter(=,'binary:sku188')"  
  20. ROW                             COLUMN+CELL                                                                                
  21.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188    
  22.    
  23. scan 'zmtest1', FILTER=>"ValueFilter(=,'substring:1')"  
  24. hbase(main):013:0> scan 'zmtest1',FILTER=>"ValueFilter(=,'substring:1')"      substring表示列值的截取串查找  
  25. ROW                             COLUMN+CELL                                                                                
  26.  user1|ts1                      column=sf:c1, timestamp=1468893512967, value=sku1                                          
  27.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188                                        
  28.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123    
  29.   
  30.    
  31. scan 'zmtest1', FILTER=>"ValueFilter(=,'substring:88')"  
  32. scan 'zmtest1', FILTER=>"ColumnPrefixFilter('c2') AND ValueFilter(=,'substring:88')"   -- ColumnPrefixFilter表示列名的substring包含,列名和列值的组合过滤  
  33. scan 'zmtest1', FILTER=>"ColumnPrefixFilter('s') AND ( ValueFilter(=,'substring:123') OR ValueFilter(=,'substring:222') )"  
  34.   
  35.   
  36. =============================================================================================================  
  37. c, 一个rowkey可以有多个版本,以timestamp来区别,而且同一个key 会有多个列名,column,  只拿出key里面第一个column的第一个version版本的值,  
  38. KeyOnlyFilter(): 只拿出key(keyonly), 去掉value的获取 这样在做count的操作时,就提高效率。  
  39. scan 'zmtest1', FILTER=>"FirstKeyOnlyFilter() AND ValueFilter(=,'binary:sku188') AND KeyOnlyFilter()"      
  40. --结果  
  41. ROW                             COLUMN+CELL                                                                                
  42.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=    
  43.    
  44. scan 'zmtest1', FILTER=>"FirstKeyOnlyFilter() AND ValueFilter(=,'binary:sku188')"  
  45. --结果  
  46. ROW                             COLUMN+CELL                                                                                
  47.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188     
  48.    
  49.    
  50. -- rowkey过滤PrefixFilter  
  51. scan 'zmtest1', FILTER => "PrefixFilter('user1')"     
  52. --结果:  
  53. ROW                             COLUMN+CELL                                                                                
  54.  user1|ts1                      column=sf:c1, timestamp=1468893512967, value=sku1                                          
  55.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188                                        
  56.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123    
  57.   
  58. -- STARTROW表示从这一行开始,包含这一行  
  59. -- STOPROW 表示到这行结束,不包含这一样  
  60. -- 其中,startrow stoprow的数值不一定就是精确值,可以是rowkey里存在的某一个子串  
  61. scan 'zmtest1', {STARTROW=>'user1|ts2', FILTER => "PrefixFilter ('user1')"}  
  62. --结果  
  63. ROW                             COLUMN+CELL                                                                                
  64.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188                                        
  65.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123   
  66. scan 'zmtest1', {STARTROW=>'user1|ts2', STOPROW=>'user2'}  
  67. --结果  
  68. ROW                             COLUMN+CELL                                                                                
  69.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188                                        
  70.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123   
  71.    
  72. scan 'zmtest1', {STARTROW=>'user1', STOPROW=>'user2'} -- user2不一定就是一个精确的rowkey  
  73. --结果  
  74. ROW                             COLUMN+CELL                                                                                
  75.  user1|ts1                      column=sf:c1, timestamp=1468893512967, value=sku1                                          
  76.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188                                        
  77.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123   
  78.   
  79. ==========================上面的filter是直接可以调用的,下面的filter是需要引用后才能使用===============================  
  80.   
  81. --   
  82. import org.apache.hadoop.hbase.filter.CompareFilter  
  83. import org.apache.hadoop.hbase.filter.SubstringComparator  
  84. import org.apache.hadoop.hbase.filter.RowFilter  
  85.   
  86. -- rowkey里面包含ts3  
  87. scan 'zmtest1', {FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('ts3'))}  
  88.   
  89. eg:  
  90. hbase(main):024:0import org.apache.hadoop.hbase.filter.CompareFilter  
  91. => Java::OrgApacheHadoopHbaseFilter::CompareFilter  
  92. hbase(main):025:0import org.apache.hadoop.hbase.filter.SubstringComparator  
  93. => Java::OrgApacheHadoopHbaseFilter::SubstringComparator  
  94. hbase(main):026:0import org.apache.hadoop.hbase.filter.RowFilter  
  95. => Java::OrgApacheHadoopHbaseFilter::RowFilter  
  96. hbase(main):027:0> scan 'zmtest1', {FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('ts3'))}  
  97. ROW                             COLUMN+CELL                                                                                
  98.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123   
  99.   
  100.    
  101.   
  102. -- 引用正则  
  103. import org.apache.hadoop.hbase.filter.RegexStringComparator  
  104.   
  105. put 'zmtest1''user2|err''sf:s1''sku999'  
  106. scan 'zmtest1', {FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),RegexStringComparator.new('^user\d+\|ts\d+$'))}  
  107. --结果  
  108. ROW                             COLUMN+CELL                                                                                
  109.  user1|ts1                      column=sf:c1, timestamp=1468893512967, value=sku1                                          
  110.  user1|ts2                      column=sf:c1, timestamp=1468893517729, value=sku188                                        
  111.  user1|ts3                      column=sf:s1, timestamp=1468893522589, value=sku123                                        
  112.  user2|ts4                      column=sf:c1, timestamp=1468893527021, value=sku2                                          
  113.  user2|ts5                      column=sf:c2, timestamp=1468893527046, value=sku288                                        
  114.  user2|ts6                      column=sf:s1, timestamp=1468893528197, value=sku222    
  115.    
  116.   
  117. import org.apache.hadoop.hbase.filter.CompareFilter  
  118. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter  
  119. import org.apache.hadoop.hbase.filter.SubstringComparator  
  120. import org.apache.hadoop.hbase.util.Bytes  
  121. scan 't1', { COLUMNS => 'family:qualifier', FILTER =>  
  122.     SingleColumnValueFilter.new  
  123.         (Bytes.toBytes('family'),  
  124.          Bytes.toBytes('qualifier'),  
  125.          CompareFilter::CompareOp.valueOf('EQUAL'),  
  126.          SubstringComparator.new('somevalue'))  
  127. }  
  128.   
  129. put 'zmtest1''user1|ts9''sf:b1''sku1'  
  130. scan 'zmtest1', FILTER=>"ColumnPrefixFilter('b1') AND ValueFilter(=,'binary:sku1')"  
  131. scan 'zmtest1', {COLUMNS => 'sf:b1', FILTER => SingleColumnValueFilter.new(Bytes.toBytes('sf'), Bytes.toBytes('b1'), CompareFilter::CompareOp.valueOf('EQUAL'), Bytes.toBytes('sku1'))}  
  132.   
  133.   
  134. -- binary value --  
  135.   
  136. org.apache.hadoop.hbase.util.Bytes.toString("Hello HBase".to_java_bytes)  
  137.   
  138. org.apache.hadoop.hbase.util.Bytes.toString("\x48\x65\x6c\x6c\x6f\x20\x48\x42\x61\x73\x65".to_java_bytes)  
  139.   
  140. -- 用户userX,作为rowkey,他的各种设备(brwoser, app, pc)作为列名,所对应的cookie_id作为value (长整型变量)  
  141. put 'zmtest1''user1''lf:browser1'"\x00\x00\x00\x00\x00\x00\x00\x02"  
  142. put 'zmtest1''user1''lf:app1'"\x00\x00\x00\x00\x00\x00\x00\x0F"  
  143. put 'zmtest1''user1''lf:app2'"\x00\x00\x00\x00\x00\x00\x00\x10"  
  144. put 'zmtest1''user2''lf:app1'"\x00\x00\x00\x00\x00\x00\x00\x11"  
  145. put 'zmtest1''user2''lf:pc1'"\x00\x00\x00\x00\x00\x00\x00\x12"  
  146.   
  147. -- ValueFilter后可以跟着 =  > < 等符号  
  148. scan 'zmtest1', {STOPROW=>'user2', FILTER=>"( ColumnPrefixFilter('app') AND ValueFilter(>,'binary:\x00\x00\x00\x00\x00\x00\x00\x0F') )"}  
  149.   
  150. scan 'zmtest1', LIMIT => 10, FILTER=>"( ColumnPrefixFilter('app') AND ValueFilter(>,'binary:\x00\x00\x00\x00\x00\x00\x00\x0F') )"  
  151. --结果  
  152. ROW                             COLUMN+CELL                                                                                
  153.  user1                          column=lf:app2, timestamp=1468906199761, value=\x00\x00\x00\x00\x00\x00\x00\x10            
  154.  user2                          column=lf:app1, timestamp=1468906199806, value=\x00\x00\x00\x00\x00\x00\x00\x11    
  155.    
  156.    
  157.   
  158.   
  159. -- 增加列族名  
  160. alter 'zmtest1', NAME => 'cf'    
  161. -- 删除列族  
  162. alter 'zmtest1', NAME => 'cf', METHOD => 'delete'  
  163. 或者  
  164. alter 'zmtest1''delete' => 'cf'  
  165. -- desc 'zmtest1'  
  166.   
  167.   
  168. -- hive hbase mapping --  其中,:key可以忽略掉  
  169.   
  170. CREATE EXTERNAL TABLE user_app_cookie_list ( username STRING, app1_cookie_id BIGINT, app2_cookie_id BIGINT )  
  171. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  172. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, lf:app1#b, lf:app2#b")  
  173. TBLPROPERTIES("hbase.table.name" = "zmtest1");  
  174.   
  175. select * from user_app_cookie_list;  
  176.   
  177. --  
  178. #b 表示binary  
  179. #s 表示字符串  
  180. 是base.columns.mapping的关键字  
  181. --  
  182. hbase符合上述条件的数据:  
  183.  user1                          column=lf:app1, timestamp=1468906199730, value=\x00\x00\x00\x00\x00\x00\x00\x0F            
  184.  user1                          column=lf:app2, timestamp=1468906199761, value=\x00\x00\x00\x00\x00\x00\x00\x10                                                   
  185.  user2                          column=lf:app1, timestamp=1468906199806, value=\x00\x00\x00\x00\x00\x00\x00\x11            
  186.  user2                          column=lf:pc1, timestamp=1468906200773, value=\x00\x00\x00\x00\x00\x00\x00\x12   
  187.    
  188.  hive> select * from user_app_cookie_list;  
  189. OK  
  190. user1   15      16  
  191. user2   17      NULL  
  192.   
  193.   
  194.   
  195. -- 用户userX,作为rowkey,在什么时间(timestamp)作为列名,访问了什么页面的id作为value:page_id (整型变量)  
  196. put 'zmtest1''user1''cf:1399999999'"\x00\x00\x00\x09"  
  197. put 'zmtest1''user1''cf:1400000000'"\x00\x00\x00\x08"  
  198. put 'zmtest1''user1''cf:1400000001'"\x00\x00\x00\x07"  
  199. put 'zmtest1''user1''cf:1400000002'"\x00\x00\x20\xFB"  
  200. put 'zmtest1''user2''cf:1500000000'"\x00\x00\x00\x11"  
  201. put 'zmtest1''user2''cf:1500000001'"\x00\x00\x20\xFC"  
  202.      表          rowkey   列族:列名         列值  
  203.   
  204.   
  205.   
  206.   
  207. -- hive hbase mapping cf with binary --  
  208.   
  209. http://www.abcn.net/2013/11/hive-hbase-mapping-column-family-with-binary-value.html  
  210.   
  211. CREATE EXTERNAL TABLE ts_string ( username STRING, visits map<string, int> )  
  212. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  213. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf:#s:b")  
  214. TBLPROPERTIES("hbase.table.name" = "zmtest1");  
  215.   
  216. CREATE EXTERNAL TABLE ts_int ( username STRING, visits map<intint> )  
  217. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  218. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf:#s:b")  
  219. TBLPROPERTIES("hbase.table.name" = "zmtest1");  
  220.   
  221. CREATE EXTERNAL TABLE ts_int_long ( username STRING, visits map<int, bigint> )  
  222. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  223. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf:#s:b")  
  224. TBLPROPERTIES("hbase.table.name" = "zmtest1");  
  225.   
  226. select * from ts_int  
  227. lateral view explode(visits) t as ts, page;  
  228.   
  229. select username, ts, page_id from ts_int  
  230. lateral view explode(visits) t as ts, page_id;  
  231.   
  232. select username, pos, ts, page_id from ts_int  
  233. lateral view posexplode(visits) t as pos, ts, page_id;  
  234.   
  235. username   pos   ts             page_id  
  236. user1      1     1399999999     9  
  237. user1      2     1400000000     8  
  238. user1      3     1400000001     7  
  239. user1      4     1400000002     8443  
  240. user2      1     1500000000     17  
  241. user2      2     1500000001     8444  
  242.   
  243. select username, from_unixtime(ts), page_id from ts_int lateral view explode(visits) t as ts, page_id;  

 

THE END
< <上一篇
下一篇>>