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

Yog*_*dra 5 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"
Run Code Online (Sandbox Code Playgroud)

这是我如何创建外部表

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/';
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

小智 9

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

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

解决权限问题后,MSCK REPAIR TABLE命令可以正常工作.

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


hba*_*hba 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/';
Run Code Online (Sandbox Code Playgroud)

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

/user/hue/exttable/CreatedAt=<someString>/profileLocation=<someString>/your-data-file
Run Code Online (Sandbox Code Playgroud)


Sus*_* Ks 5

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

使您的profileLocationtoprofilelocationprofile_location并测试它应该工作。

我的问题在这里无法通过 Hive 1.2 中的 alter table 恢复分区


小智 0

Hive 在其元存储中存储每个表的分区列表。但是,如果将新分区直接添加到 HDFS(通过 hadoop fs -put 命令手动),元存储将不会意识到这些分区。你需要添加分区

ALTER TABLE 外部示例添加分区

对于每个分区或者简而言之你可以运行

MSCK REPAIR TABLE 外部示例;它将把 HDFS 上存在但元存储中不存在的任何分区添加到元存储中。

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