/ / HiveでProtoBufシリアライズHBase列をデシリアライズする方法 - hive、hbase、プロトコルバッファ、hive-serde、protobuf-java

HiveでProtoBufのシリアル化されたHBase列を逆シリアル化する方法 - hive、hbase、protocol-buffers、hive-serde、protobuf-java

私は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=x0Ax06kim123x12x06kimkimx1Ax10kim123@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");

ハイブテーブルを照会したときに、hbaseから挿入されたレコードが表示されない

ここで何が悪いのか教えてください。

回答:

回答№1は0

あなたはバイナリprotobufを取り、それを何らかの可読構造(コンマ区切りまたはjson)に変換するUDFを書くことを試みることができます。値をバイナリデータとしてマップするようにする必要があります。