2010-03-12 2 views
5

Привет, я использую SQL, но мне нужно прочитать данные из таблицы HBase. Любая помощь в этом была бы замечательной. Книга или, может быть, просто образец кода для чтения из таблицы. Кто-то сказал, что использование сканера сделает трюк, но я не знаю, как его использовать.Как читать данные от Hbase?

ответ

9

От the website:

// 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(); 
} 
+0

Спасибо за образец кода. – WackoMax

+0

Это может стать медленным, поскольку он возвращает одну строку для каждого 'scanner.next()', вы можете сначала включить кеширование с 's.setCashing (numberOfRows)', как описано [здесь] (http: //elsoufy.blogspot. пт/2014/06/gettint стартер-с-hbase.html). – bachr

2

Я использовал это, но, чтобы получить значение типа String необходимо использовать метод ПолучитьЗначение от результата.

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

Я хотел бы предложить решение без устаревших методов

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<String, String> 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<String, String> 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(); 
    }); 
+0

, в котором зависимость maven содержит api? – Normal

+1

Я использую org.apache.hbase: hbase-client: 1.1.2 –

Смежные вопросы