使用带有hive的elephant bird读取protobuf数据

a6b3iqyw  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(570)

我也有类似的问题
以下是我使用的:
cdh4.4(Hive0.10)
protobuf java-.2.4.1.jar
elephant-bird-hive-4.6-snapshot.jar
elephant-bird-core-4.6-snapshot.jar
elephant-bird-hadoop-compat-4.6-snapshot.jar
包含protoc编译的.class文件的jar文件。
我的流协议缓冲区java教程创建了我的数据“testbook”。
我呢
使用 hdfs dfs -mkdir /protobuf_data 创建hdfs文件夹。
使用 hdfs dfs -put testbook /protobuf_data 将“testbook”放到hdfs中。
然后我按照象鸟网页创建表,语法如下:

create table addressbook
  row format serde "com.twitter.elephantbird.hive.serde.ProtobufDeserializer"
  with serdeproperties (
    "serialization.class"="com.example.tutorial.AddressBookProtos$AddressBook")
  stored as
    inputformat "com.twitter.elephantbird.mapred.input.DeprecatedRawMultiInputFormat"
    OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
  LOCATION '/protobuf_data/';

一切顺利。
但当我提交查询时 select * from addressbook; 没有结果。
我找不到任何要调试的错误日志。
有人能帮我吗?
非常感谢

kx1ctssn

kx1ctssn1#

问题已经解决了。
首先我将protobuf二进制数据直接放入hdfs,没有结果显示。
因为这样不行。
在询问了一些资深同事之后,他们说二进制数据的protobuf应该被写入某种容器,某种文件格式,比如hadoop sequencefile等等。
elephant-bird 网页也写了信息,但首先我不能完全理解它。
将protobuf二进制数据写入sequencefile后,我可以用hive读取protobuf数据。
因为我使用的是sequencefile格式,所以我使用的是create table语法:

inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'
outputformat 'org.apache.hadoop.mapred.SequenceFileOutputFormat'

希望它能帮助其他刚接触hadoop、hive、elephant的人。

相关问题