我已经使用protobuf来序列化类并存储在hbase列中。我想减少简单聚合的map reduce作业的数量,所以我需要类似sql的工具来查询数据。如果我使用hive,是否可以扩展hbastoragehandler并为每个表编写我们自己的serde?或任何其他好的解决方案。
更新时间:
我将hbase表创建为
创建'hive:users'我'
并从JavaAPI中插入用户数据,
public static final byte[] INFO_FAMILY = Bytes.toBytes("i");
private static final byte[] USER_COL = Bytes.toBytes(0);
public Put mkPut(User u)
{
Put p = new Put(Bytes.toBytes(u.userid));
p.addColumn(INFO_FAMILY, USER_COL, UserConverter.fromDomainToProto(u).toByteArray());
return p;
}
我的扫描结果如下:
hbase(main):016:0> scan 'hive:users'
ROW COLUMN+CELL
kim123 column=i:\x00, timestamp=1521409843085, value=\x0A\x06kim123\x12\x06kimkim\x1A\x10kim123@gmail.com
1 row(s) in 0.0340 seconds
当我在配置单元中查询表时,没有看到任何记录。这是我用来创建表的命令。
create external table users(userid binary, userobj binary)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = ":key, i:0", "hbase.table.default.storage.type" = "binary")
tblproperties("hbase.table.name" = "hive:users");
查询配置单元表时,没有看到从hbase插入的记录。
你能告诉我这里怎么了吗?
1条答案
按热度按时间vaqhlq811#
您可以尝试编写一个采用二进制protobuf并将其转换为可读结构(逗号分隔或json)的udf。您必须确保将值Map为二进制数据。