Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 配置单元0.13 msck修复表仅列出不在metastore中的分区_Hive_Hiveql_Hadoop2 - Fatal编程技术网

Hive 配置单元0.13 msck修复表仅列出不在metastore中的分区

Hive 配置单元0.13 msck修复表仅列出不在metastore中的分区,hive,hiveql,hadoop2,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 Extern

我试图使用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/';

我遗漏了什么吗?

配置单元在其元存储中为每个表存储一个分区列表。但是,如果直接将新分区添加到HDFS(通过hadoop fs-put命令手动添加),metastore将不会知道这些分区。 您需要添加分区

altertableexternalexample添加分区

对于每个分区 或者简而言之,你可以跑步

MSCK修复表外部示例; 它将把存在于HDFS上但不在metastore中的任何分区添加到metastore中


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

例如,在您的表创建示例中,我看到您根本没有定义任何分区

我认为您需要这样做(注意使用PARTITIONED BY):

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

/user/hue/exttable/CreatedAt=<someString>/profileLocation=<someString>/your-data-file
/user/hue/exttable/CreatedAt=/profileLocation=/your数据文件

您只是缺少分区依据(CreatedAt STRING,profileLocation STRING)我在MSCK修复表中遇到了一个类似的问题,该表列出了不在元存储中但没有实际添加的分区(并且没有错误消息)

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

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

如果您遇到这个问题,可以尝试使用ALTERTABLEADDPARTITION命令手动添加它。它可能会产生一条有用的错误消息,帮助您确定问题的根本原因。

1)您需要指定分区
2) 分区名称必须包含所有小写字母。请参见此-

MSCK修复表外部表的分区名称应为小写,然后只有它会将其添加到配置单元元存储中,我在配置单元1.2.1中遇到了类似的问题,其中不支持
ALTER TABLE ExternalTable RECOVER partition
,但在花了一些时间进行调试后,发现分区名称应该是小写的问题,即
/some\u external\u path/mypartion=01
是有效的,而
/some\u external\u path/mypartition=01
是无效的

将您的
profileLocation
设置为
profileLocation
profile\u location
并测试它是否正常工作


我的问题是

您可能不是作为蜂巢运行用户

sudo-u配置单元**hive-e“设置配置单元.msck.path.validation=ignore;msck修复表T1”


设置hive.msck.path.validation=ignore(这适用于具有大量分区的表。)

谢谢,我理解这一点。但是当我运行MSCK REPAIR TABLE ExternalExample时所面临的问题;它并没有将分区添加到元存储中,而是给出了不在元存储中的分区。现在清楚了吗?
CreatedAt
profileLocation
在SQL中是不区分大小写的,但在文件路径中它们都必须是小写的。
/user/hue/exttable/CreatedAt=<someString>/profileLocation=<someString>/your-data-file