java—从通过配置单元插入的hbase读取数据时出现问题

cgvd09ve  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(485)

我已经创建了一个hbase配置单元表。在其中,我通过配置单元插入数据。

CREATE TABLE hivetest(cookie string, timespent string, pageviews string, visit string, logdate string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "m:timespent, m:pageviews, m:visit, m:logdate")
TBLPROPERTIES ("hbase.table.name" = "hbasetest");

正确插入数据。我可以使用hbase shell访问相同的数据。但是,我创建了一个hbase客户机,它在访问相同的数据时返回空点异常。
现在的问题是,如果我创建一个虚拟hbase表,并通过hbase shell而不是通过hive放置一些数据,然后尝试从hbase客户机获取这些数据。它不会给出错误并返回数据。另外,如果我试图通过hbase client将数据放入hbasetest表的某一行,然后尝试获取同一行,也会发生同样的情况。这次它给了我数据。
所以,我的问题是,通过hive和hbase shell编写数据有什么区别?
hbase客户端:

Configuration conf = HBaseConfiguration.create();
   Map variables = System.getenv();
   conf.set("hbase.zookeeper.quorum","192.168.0.92");
   HTable table;
   byte family[];
   byte qualifier[];           
   table = new HTable(conf, "hivetest");
   family = Bytes.toBytes("m");
   qualifier = Bytes.toBytes("logdate");             
   Get get = new Get(Bytes.toBytes("cookie_value"));    
   Result r = table.get(get);         
   byte  valueObj[] = r.getValue(family, qualifier);     
   byte  keyObj[] = r.getRow();
   String key = new String(keyObj);  
   String value = new String(valueObj);   /* line where exception occur */
   System.out.println((new StringBuilder(String.valueOf(key))).append(" = ").append(value).toString());

例外情况:

Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.<init>(Unknown Source)
    at com.hbase.test.HbaseExample.main(HbaseExample.java:51)
f1tvaqid

f1tvaqid1#

您正在使用配置单元版本0.9.0吗?如果是这样的话,那个版本就有一个bug。hbastoragehandler的serde不忽略逗号和列族之间的空白。这使得存储的列族的名称与预期的不同。
第51行的例子是什么?

byte  valueObj[] = r.getValue(family, qualifier);

尝试在serdePropertyMap中去掉逗号符号和列族之间的空格。
请参见:https://issues.apache.org/jira/browse/hive-3243

相关问题