无法对hdfs支持的配置单元表进行分区

ix0qys7i  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(375)

也许这是一个简单的问题,但我有一个困难的时间来解决这个问题。此时,我有一个伪分布式hdfs,其中包含使用protobuf3.0.0编码的录制。然后,使用elephant bird/hive,我可以将数据放入hive表中进行查询。我遇到的问题是对数据进行分区。
这是我正在使用的table create语句

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表,并且看到分区列不需要是正在加载的数据的一部分。我尝试对日期进行分区的原因不仅是为了性能,更重要的是因为“加载数据…”语句在hdfs中的目录之间移动文件。
p、 我已经证明我能够在没有分区的情况下对配置单元表运行查询。
有什么想法吗?

wrrgggsh

wrrgggsh1#

我看到您已经创建了外部表。所以不能使用配置单元添加或删除分区。您需要使用hdfs或mr或spark创建一个文件夹。外部表只能由配置单元读取,但不能由hdfs管理。您可以检查hdfs位置'/test/dt=20171117',您将看到该文件夹尚未创建。
我的建议是使用“hadoop fs-mkdir'/test/20171117'”创建文件夹(分区),然后尝试查询表。尽管它将给出0行。但您可以将数据添加到该文件夹并从配置单元读取。

2vuwiymt

2vuwiymt2#

您需要为外部表指定一个位置

CREATE EXTERNAL TABLE 
... 
LOCATION '/test';

那么,数据实际上是序列文件吗?你只说这是原始数据。我不知道elephantbird库是怎么工作的,但你要仔细检查一下。
然后,您的table位置需要看起来像 /test/dt=value 为了让Hive读取它们。
在hdfs位置上创建外部表之后,必须运行 MSCK REPAIR TABLE table_name 对于要添加到配置单元元存储的分区

相关问题