【问题标题】:HBase read data returns nullHBase 读取数据返回 null
【发布时间】:2016-02-28 17:38:48
【问题描述】:

我创建了一个 java 应用程序来从 HBase 读取数据。我检查了link1link2link3link4。即使我的表中有数据,程序也会返回 null。

hbase 外壳:

 hbase(main):009:0> get 'login','1'
 COLUMN                CELL                                                      
 password: password   timestamp=1456588594424, value=hpassword                     
 username: username   timestamp=1456588582413, value=husername                     
 2 row(s) in 0.0120 seconds

代码:

Configuration config = HBaseConfiguration.create();
HTable table = new HTable(config, "login");
Get g = new Get(Bytes.toBytes("row1"));
Result r = table.get(g);

byte [] value = r.getValue(Bytes.toBytes("username"),Bytes.toBytes("username"));
byte [] value1 = r.getValue(Bytes.toBytes("password"),Bytes.toBytes("password"));

String valueStr = Bytes.toString(value);
String valueStr1 = Bytes.toString(value1);
System.out.println("username: "+ valueStr+"\npassword: "+valueStr1);
Scan s = new Scan();
s.addColumn(Bytes.toBytes("username"), Bytes.toBytes("username"));
s.addColumn(Bytes.toBytes("password"), Bytes.toBytes("password"));
ResultScanner scanner = table.getScanner(s);

try
{
 for (Result rnext = scanner.next(); rnext != null; rnext = scanner.next())
  {
    System.out.println("Found row : " + rnext);
   }
 }finally{
  scanner.close();
 }

输出:

username: null
password: null

我是否遗漏了什么,或者我需要在代码中的某个地方进行编辑?

另外,我需要将它实现到 Java Play 框架中。你有什么想法吗?

提前致谢。

【问题讨论】:

  • 不清楚使用什么列族来存储数据。您对列和列族都使用“用户名”,这似乎是错误的
  • 感谢您的帮助。我更改了它们并将 Bytes.toBytes("row1")) "row1" 更改为 "1"。
  • 为什么要同时使用scan和get?
  • 测试这些功能之间的差异

标签: java hadoop playframework hbase


【解决方案1】:

试试这个:

 // Instantiating Configuration class
  Configuration config = HBaseConfiguration.create();

  // Instantiating HTable class
  HTable table = new HTable(config, "tablename");

  // Instantiating the Scan class
  Scan scan = new Scan();

  // Scanning the required columns
  scan.addColumn(Bytes.toBytes("columnfamily"), Bytes.toBytes("column1"));
  scan.addColumn(Bytes.toBytes("columnfamily"), Bytes.toBytes("column2"));

  // Getting the scan result
  ResultScanner scanner = table.getScanner(scan);

  // Reading values from scan result
  for (Result result = scanner.next(); result != null; result = scanner.next())

  System.out.println("Found row : " + result);
  //closing the scanner
  scanner.close();

【讨论】:

  • 列名和列族同名,我改了名字。它现在运行良好。感谢您提供更简洁的代码。
【解决方案2】:

正如@AdamSkywalker 所说,我需要更改列名和列族的名称。当他们的名字相同时,我得到了空回报。 我重命名了它们,代码运行良好。

【讨论】:

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