代码之家  ›  专栏  ›  技术社区  ›  karthikhr

如何反序列化配置单元中ProtoBuf序列化的HBase列?

  •  0
  • karthikhr  · 技术社区  · 6 年前

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

    更新日期:

    我将HBase表创建为

    创建“配置单元:用户”,“我”

    并从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
    

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

    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 回复  |  直到 6 年前
        1
  •  0
  •   botchniaque    6 年前

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