Permalink
Browse files

Tossing up some examples of Filter use in Java so that I can remember…

… next time.
  • Loading branch information...
1 parent fdd9dfa commit 8cf73f413a506c887e0fd5a36e51f40c4dae2312 @hammer hammer committed May 14, 2010
Showing with 123 additions and 0 deletions.
  1. +123 −0 JBase.java
View
@@ -0,0 +1,123 @@
+import java.io.IOException;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.hadoop.hbase.HBaseConfiguration;
+
+import org.apache.hadoop.hbase.client.Get;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.ResultScanner;
+import org.apache.hadoop.hbase.client.Scan;
+
+import org.apache.hadoop.hbase.filter.Filter;
+import org.apache.hadoop.hbase.filter.FilterList;
+import org.apache.hadoop.hbase.filter.PrefixFilter;
+import org.apache.hadoop.hbase.filter.QualifierFilter;
+import org.apache.hadoop.hbase.filter.BinaryComparator;
+import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
+import org.apache.hadoop.hbase.filter.FilterList.Operator;
+
+import org.apache.hadoop.hbase.util.Bytes;
+
+// Class that has nothing but a main.
+// Does a Put, Get and a Scan against an hbase table.
+public class JBase {
+ public static void main(String[] args) throws IOException {
+ // You need a configuration object to tell the client where to connect.
+ // When you create a HBaseConfiguration, it reads in whatever you've set
+ // into your hbase-site.xml and in hbase-default.xml, as long as these can
+ // be found on the CLASSPATH
+ HBaseConfiguration config = new HBaseConfiguration();
+
+ // This instantiates an HTable object that connects you to
+ // the "myLittleHBaseTable" table.
+ HTable table = new HTable(config, "t1");
+
+ // To add to a row, use Put. A Put constructor takes the name of the row
+ // you want to insert into as a byte array. In HBase, the Bytes class has
+ // utility for converting all kinds of java types to byte arrays. In the
+ // below, we are converting the String "myLittleRow" into a byte array to
+ // use as a row key for our update. Once you have a Put instance, you can
+ // adorn it by setting the names of columns you want to update on the row,
+ // the timestamp to use in your update, etc.If no timestamp, the server
+ // applies current time to the edits.
+ Put p = new Put(Bytes.toBytes("r1"));
+
+ // To set the value you'd like to update in the row 'myLittleRow', specify
+ // the column family, column qualifier, and value of the table cell you'd
+ // like to update. The column family must already exist in your table
+ // schema. The qualifier can be anything. All must be specified as byte
+ // arrays as hbase is all about byte arrays. Lets pretend the table
+ // 'myLittleHBaseTable' was created with a family 'myLittleFamily'.
+ p.add(Bytes.toBytes("cf1"), Bytes.toBytes("c3"),
+ Bytes.toBytes("fromtheclient"));
+
+ // Once you've adorned your Put instance with all the updates you want to
+ // make, to commit it do the following (The HTable#put method takes the
+ // Put instance you've been building and pushes the changes you made into
+ // hbase)
+ table.put(p);
+
+ // Now, to retrieve the data we just wrote. The values that come back are
+ // Result instances. Generally, a Result is an object that will package up
+ // the hbase return into the form you find most palatable.
+ Get g = new Get(Bytes.toBytes("r1"));
+ Result r = table.get(g);
+ byte [] value = r.getValue(Bytes.toBytes("cf1"),
+ Bytes.toBytes("c3"));
+ // If we convert the value bytes, we should get back 'Some Value', the
+ // value we inserted at this location.
+ String valueStr = Bytes.toString(value);
+ System.out.println("GET: " + valueStr);
+
+ // Sometimes, you won't know the row you're looking for. In this case, you
+ // use a Scanner. This will give you cursor-like interface to the contents
+ // of the table. To set up a Scanner, do like you did above making a Put
+ // and a Get, create a Scan. Adorn it with column names, etc.
+ Scan s = new Scan();
+ s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("c1"));
+ ResultScanner scanner = table.getScanner(s);
+ try {
+ // Scanners return Result instances.
+ // Now, for the actual iteration. One way is to use a while loop like so:
+ for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
+ // print out the row we found and the columns we were looking for
+ System.out.println("Found row: " + rr);
+ }
+
+ // The other approach is to use a foreach loop. Scanners are iterable!
+ // for (Result rr : scanner) {
+ // System.out.println("Found row: " + rr);
+ // }
+ } finally {
+ // Make sure you close your scanners when you are done!
+ // Thats why we have it inside a try/finally clause
+ scanner.close();
+ }
+
+ // Using Filters
+ Filter f1 = new PrefixFilter(Bytes.toBytes("r"));
+ Filter f2 = new QualifierFilter(CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("c2")));
+ List<Filter> fs = Arrays.asList(f1, f2);
+ Filter f3 = new FilterList(Operator.MUST_PASS_ALL, fs);
+
+ Scan s2 = new Scan();
+
+ //s2.setFilter(f1);
+ //s2.setFilter(f2);
+ s2.setFilter(f3);
+
+ ResultScanner scanner2 = table.getScanner(s2);
+ try {
+ for (Result rr : scanner2) {
+ System.out.println("Filter " + s2.getFilter() + " matched row: " + rr);
+ }
+ } finally {
+ scanner2.close();
+ }
+
+ } // main()
+} // Class

0 comments on commit 8cf73f4

Please sign in to comment.