如何从Hbase读取数据?

您好,我习惯使用SQL,但我需要从HBase表中读取数据。 对此的任何帮助都会很棒。 一本书或者可能只是从表中读取的一些示例代码。 有人说使用扫描仪可以解决问题,但我不知道如何使用它。

来自网站 :

// 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("myLittleFamily"), Bytes.toBytes("someQualifier")); 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(); } 

我想提供没有弃用方法的解决方案

  Configuration conf = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin(); // list the tables Arrays.stream(admin.listTables()).forEach(System.out::println); // let's insert some data in 'mytable' and get the row TableName tableName = TableName.valueOf("test_1"); Table table = connection.getTable(tableName); //Put Put thePut = new Put(Bytes.toBytes("rowkey1")); String columnFamily = "m"; String columnQualifier1 = "col1"; String outValue1 = "value1"; String columnQualifier2 = "col2"; String outValue2 = "value2"; thePut.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnQualifier1), Bytes.toBytes(outValue1)); thePut.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnQualifier2), Bytes.toBytes(outValue2)); table.put(thePut); //Get Get theGet = new Get(Bytes.toBytes("rowkey1")); Result result = table.get(theGet); //get value first column String inValue1 = Bytes.toString(result.value()); //get value by ColumnFamily and ColumnName byte[] inValueByte = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnQualifier1)); String inValue2 = Bytes.toString(inValueByte); //loop for result for (Cell cell : result.listCells()) { String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell)); String value = Bytes.toString(CellUtil.cloneValue(cell)); System.out.printf("Qualifier : %s : Value : %s%n", qualifier, value); } //create Map by result and print it Map getResult = result.listCells().stream().collect(Collectors.toMap(e -> Bytes.toString(CellUtil.cloneQualifier(e)), e -> Bytes.toString(CellUtil.cloneValue(e)))); getResult.entrySet().stream().forEach(e -> System.out.printf("Qualifier : %s : Value : %s%n", e.getKey(), e.getValue())); System.out.println("---------Scan---------"); Scan scan = new Scan(); ResultScanner resultScan = table.getScanner(scan); resultScan.forEach(e -> { System.out.printf("Row \"%s\"%n", Bytes.toString(e.getRow())); Map getResultScan = e.listCells().stream().collect(Collectors.toMap(d -> Bytes.toString(CellUtil.cloneQualifier(d)), d -> Bytes.toString(CellUtil.cloneValue(d)))); getResultScan.entrySet().stream().forEach(d -> System.out.printf("column \"%s\", value \"%s\"%n", d.getKey(), d.getValue())); System.out.println(); }); 

我使用了它,但要获取String值,您必须使用Result中的方法getValue。

 byte[] bytes = rr.getValue(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier")); System.out.println(new String(bytes));