如何在Hive中反序列化ProtoBuf序列化HBase列?

时间:2018-03-17 20:05:57

标签: hive hbase protocol-buffers hive-serde protobuf-java

我已经使用ProtoBuf来序列化类并存储在HBase Columns中。 我希望减少Map Reduce作业的数量以便进行简单的聚合,因此我需要SQL工具来查询数据。 如果我使用Hive,是否可以扩展HBaseStorageHandler并为每个表编写我们自己的Serde? 或任何其他好的解决方案可用。

更新

我将HBase表创建为

  

创建'hive:users','i'

并从java api插入用户数据,

 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

当我在Hive中查询表时,我没有看到任何记录。 这是我用来创建表的命令。

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");

当我查询hive表时,我没有看到从hbase插入的记录。

你能告诉我这里有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试编写一个UDF,它将采用二进制protobuf并将其转换为某种可读结构(逗号分隔或json)。您必须确保将值映射为二进制数据。