【问题标题】:How to deserialize the ProtoBuf serialized HBase columns in Hive?如何反序列化 Hive 中的 ProtoBuf 序列化 HBase 列?
【发布时间】:2018-03-17 20:05:56
【问题描述】:

我使用 ProtoBuf 序列化类并存储在 HBase 列中。 我想减少简单聚合的 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 插入的记录。

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

【问题讨论】:

  • 您的列映射可能已损坏 - 尝试删除空格,例如 :key,i:0。否则它看起来没问题,应该可以在 IMO 工作。
  • 感谢@botchniaque,我在创建表格时删除了空格。我的select * from users 返回了 0 条记录,其中 select count(*) from users 返回计数为 1,select users.userid from users 给出了 IOException。 Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating userid (state=,code=0)
  • 您是否有权访问配置单元服务器日志?根据经验,它们提供了比弹出到用户界面的更有用的细节。试试/var/log/hive/hive-server2.log 什么的。
  • 还有一件事 - 您在列中使用字节 x00,但 hbase.columns.mapping 似乎是基于文本的。也许尝试写列 ASCII 0。在这种情况下,您应该调用Bytes.toBytes("0")(零作为字符,而不是字节数)。也许这就是问题
  • 我尝试使用 Bytes.toBytes("0"),仍然没有看到直线 cli 中的数据,可能是因为二进制。但我确信数据已映射,因为它正确显示了计数,我将编写一个简单的 udf 将二进制转换为字符串,保持帖子更新。谢谢@botchniaque

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


【解决方案1】:

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

【讨论】:

  • 我更新了问题以获取更多详细信息。你能帮我解决这个问题吗? @botchniaque
  • 我可以从 udf 反序列化 protobuf 并返回一个 json,以便可以从 get_json_object 和 get_tuple 进一步处理 @botchniaque 非常感谢
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多