也许这是一个简单的问题,但是我很难解决这个问题。目前,我有一个伪分布式 HDFS,其中包含使用 protobuf 3.0.0 编码的记录。然后,使用 Elephant-Bird/Hive 我可以将这些数据放入 Hive 表中进行查询。我遇到的问题是对数据进行分区。
这是我正在使用的表创建语句
CREATE EXTERNAL TABLE IF NOT EXISTS test_messages
PARTITIONED BY (dt string)
ROW FORMAT SERDE
"com.twitter.elephantbird.hive.serde.ProtobufDeserializer"
WITH serdeproperties (
"serialization.class"="path.to.my.java.class.ProtoClass")
STORED AS SEQUENCEFILE;
表已创建,当我查询表时没有收到任何运行时错误。
当我尝试按如下方式加载数据时:
ALTER TABLE test_messages_20180116_20180116 ADD PARTITION (dt = '20171117') LOCATION '/test/20171117'
我收到“OK”声明。但是,当我查询表时:
select * from test_messages limit 1;
我收到以下错误:
Failed with exception java.io.IOException:java.lang.IllegalArgumentException: FieldDescriptor does not match message type.
我一直在阅读 Hive 表并看到分区列不需要是正在加载的数据的一部分。我试图对日期进行分区的原因既是为了提高性能,更重要的是,因为“LOAD DATA ...”语句在 HDFS 的目录之间移动文件。
PS 我已经证明我能够在不分区的情况下对 hive 表运行查询。
有什么想法吗 ?