hadoop - 无法分区由HDFS支持的配置单元表

标签 hadoop hive elephantbird

也许这是一个简单的问题,但我很难解决这个问题。目前,我有一个伪分布式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'

我收到“确定”的声明。但是,当我查询表时:
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中的目录之间移动文件。

附言我证明了我可以对配置单元表运行查询而无需进行分区。

有什么想法吗 ?

最佳答案

我看到您已经创建了EXTERNAL TABLE。因此,您不能使用配置单元添加或删除分区。您需要使用hdfs或MR或SPARK创建一个文件夹。 EXTERNAL表只能由配置单元读取,而不能由HDFS管理。您可以检查hdfs位置“/ test / dt = 20171117”,您将看到尚未创建该文件夹。

我的建议是使用“hadoop fs -mkdir'/ test / 20171117'”创建文件夹(分区),然后尝试查询表。尽管它将给出0行。但是您可以将数据添加到该文件夹​​并从Hive中读取。

关于hadoop - 无法分区由HDFS支持的配置单元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48410875/

相关文章:

java - 如何在Hadoop环境中执行用Java编写的Hadoop Job

hadoop - 使用elephant-bird配合hive读取protobuf数据

maven - 如何构建节俭的0.9.1版twitter的象鸟?

hadoop - 多个节点中的 Hive 表 - 处理

java - 将 protobuf 3 与 Hive 和 Elephant-Bird 结合使用

hadoop - 我的映射器输入和 reducer 输出如何相同

hadoop - pig 交叉连接和替换

java - 从Hadoop Job中提取JobID等

hadoop - 在 Hadoop 上执行更新操作

python - 如何让Pandas Python中的HBase中不存储空值?