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

How to deserialize the ProtoBuf serialized HBase columns in Hive?

我使用 ProtoBuf 序列化 class 并存储在 HBase 列中。 我想减少简单聚合的 Map Reduce 作业数量,所以我需要 SQL 之类的工具来查询数据。 如果我使用 Hive,是否可以扩展 HBaseStorageHandler 并为每个 Table 编写我们自己的 Serde? 或者任何其他好的解决方案都可用。

已更新:

我将 HBase table 创建为

create '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 中查询 table 时,我没有看到任何记录。 这是我用来创建 table.

的命令
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");

当我查询配置单元时 table 我没有看到从 hbase 插入的记录。

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

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