【问题标题】:How to read data from Hbase?如何从 Hbase 读取数据?
【发布时间】:2011-01-26 17:54:42
【问题描述】:

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

【问题讨论】:

    标签: java hbase


    【解决方案1】:

    来自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();
    }
    

    【讨论】:

    • 这可能会变慢,因为它会为每个scanner.next() 返回一行,您可以先使用s.setCashing(numberOfRows) 启用缓存,如here 所述。
    【解决方案2】:

    我想提供不推荐使用方法的解决方案

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

    【讨论】:

    • 哪个maven依赖包含那个api?
    • 我使用 org.apache.hbase:hbase-client:1.1.2
    【解决方案3】:

    我使用了它,但要获取字符串值,您必须使用方法 getValue from Result。

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

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多