Java 从通过配置单元插入的hbase读取数据时出现问题
我已经创建了一个hbase配置单元表。在其中,我通过配置单元插入数据Java 从通过配置单元插入的hbase读取数据时出现问题,java,hadoop,hbase,hive,apache-zookeeper,Java,Hadoop,Hbase,Hive,Apache Zookeeper,我已经创建了一个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
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外壳访问相同的数据。但是,我创建了一个hbase客户端,它在访问相同数据时返回空点异常
现在的问题是,如果我创建一个虚拟hbase表,并通过hbase shell而不是通过HIVE放置一些数据,然后尝试从hbase客户端获取这些数据。它不会给出错误并返回数据。
同样,如果我尝试通过hbase客户端将数据放入hbasetest表的某一行,然后尝试获取同一行,也会发生同样的情况。现在这一次它给了我数据
那么,我的问题是,通过hive和hbase外壳写入数据有什么区别?
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)
线程“main”java.lang.NullPointerException中的异常
位于java.lang.String。(未知源)
位于com.hbase.test.HbaseExample.main(HbaseExample.java:51)
您使用的是hive版本0.9.0吗? 如果是这样,那么这个版本就有一个bughbastoragehandler的SerDe不会忽略逗号和列族之间的空格。这使得存储的列族的名称与预期的不同 HbaseExample类中的第51行是吗
byte valueObj[] = r.getValue(family, qualifier);
尝试在SerdeProperty映射中去掉逗号符号和列族之间的空格
见: