hive 0.13 msck修复表仅列出不在Metastore中的分区

时间:2014-11-05 09:30:20

标签: hive hiveql hadoop2

我尝试使用Hive(0.13)msck repair table命令来恢复分区,它只列出未添加到Metastore中的分区,而不是将它们添加到Metastore中。

这里是命令的输出

partitions not in metastore externalexample:CreatedAt=26 04%3A50%3A56 UTC 2014/profileLocation="Chicago"

这是我创建外部表格的方式

CREATE EXTERNAL TABLE IF NOT EXISTS ExternalExample(
        tweetId BIGINT, username STRING,
        txt STRING, CreatedAt STRING,
        profileLocation STRING,
        favc BIGINT,retweet STRING,retcount BIGINT,followerscount BIGINT)
    COMMENT 'This is the Twitter streaming data'
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    STORED AS TEXTFILE
    location '/user/hue/exttable/';

我错过了什么吗?

7 个答案:

答案 0 :(得分:8)

我在MSCK REPAIR TABLE中遇到了类似的问题,列出了不在Metastore中但没有实际添加它们的分区(并且没有错误消息)。

我尝试使用ALTER TABLE ADD PARTITION命令手动添加分区,这给了我一条错误消息,导致我找到了包含'缺少'的HDFS文件夹的根本原因。已使用不正确的权限设置分区。

解决了权限问题后,MSCK REPAIR TABLE命令才能正常工作。

如果遇到此问题,尝试使用ALTER TABLE ADD PARTITION命令手动添加它可能是值得的。它可能会产生一个有用的错误消息,可帮助您确定问题的根本原因。

答案 1 :(得分:5)

请确保表定义中定义的分区名称与hdfs上的分区名称相匹配。

例如,在您的表创建示例中,我发现您还没有定义任何分区。

我想你想做这样的事情(注意使用PARTITIONED BY):

create external table ExternalExample(tweetId BIGINT, username STRING, txt STRING,favc BIGINT,retweet STRING,retcount BIGINT,followerscount BIGINT) PARTITIONED BY (CreatedAt STRING, profileLocation STRING) COMMENT 'This is the Twitter streaming data' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE location '/user/hue/exttable/';

然后在hdfs上你应该有以下文件夹结构:

/user/hue/exttable/CreatedAt=<someString>/profileLocation=<someString>/your-data-file

答案 2 :(得分:2)

MSCK REPAIR TABLE ExternalTable的分区名称应为小写,然后才会将其添加到hive Metastore中,我在hive 1.2.1中遇到类似的问题,其中不支持ALTER TABLE ExternalTable RECOVER PARTITION,但之后花一些时间调试发现分区名称应该是小写的问题,即/some_external_path/mypartion=01有效且/some_external_path/myParition=01无效;

profileLocation设为profilelocationprofile_location并对其进行测试。

我的问题是Not able to recover partitions through alter table in Hive 1.2

答案 3 :(得分:1)

Hive为其Metastore中的每个表存储分区列表。但是,如果将新分区直接添加到HDFS(由hadoop fs -put命令手动添加),则Metastore将不会知道这些分区。 你需要添加分区

ALTER TABLE ExternalExample ADD PARTITION

为每个分区 或者简而言之,你可以运行

MSCK REPAIR TABLE ExternalExample; 它将添加HDFS上存在但不在Metastore中的任何分区到Metastore。

参考https://issues.apache.org/jira/browse/HIVE-874

答案 4 :(得分:0)

1)您需要指定分区 2)分区名称必须包含所有小写字母。见这 - https://singhanuvrat.com/hive-partition-column-name-camelcase-bad-idea-b89796d4e741#.16d7uqfot

答案 5 :(得分:-1)

您错过了PARTITIONED BY (CreatedAt STRING, profileLocation STRING)

答案 6 :(得分:-1)

您可能没有以 hive 用户的身份运行:

emplace_back(int, std::string)

emplace_back(initializer-list)(适用于具有大量分区的表。)