سؤال

مرحبا، أنا أستخدمه إلى 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<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();
    });

اعتدت ذلك، ولكن للحصول على قيمة السلسلة يجب عليك استخدام الأسلوب GetValue من النتيجة.

byte[] bytes = rr.getValue(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"));
System.out.println(new String(bytes));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top