分享

Hive 2.1.1创建表没有问题,但是show tables报错

Sno 发表于 2017-3-17 16:22:37 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 3 9796
大家好,我使用hive2.1.1,在hive命令行下,可以创建表,load数据,也可以select * from 表名。

但是有许多命令,比如show tables,  describe 表名,总是报错

hive> show tables;
OK
Failed with exception java.io.IOException:java.lang.IllegalArgumentException: Wrong FS: file:/tmp/root/72507897-41f2-49e5-baa7-f4a2645815c5/hive_2017-03-17_16-14-16_434_3889447163120601366-1/-local-10000, expected: hdfs://ns
Time taken: 0.176 seconds


执行select * from 表名,结果正常,

select * from 表名

select * from 表名

但是select * from table order by xxx,又报同样的错误
456.png

感觉好像只要是用了mapreduce,就会出现这个错误

hive日志如下图所示
789.png


请大神帮忙

已有(3)人评论

跳转到指定楼层
Sno 发表于 2017-3-17 17:23:32
找到问题根源所在啦,因为要使用flume导入数据到hive,但是会产生.tmp文件,所以我就自己实现了一个PathFilter,

public class HivePathFilter extends Configured implements PathFilter {
        private Configuration conf;
        private FileSystem fs;
       
       

        public boolean accept(Path path) {
                try {
                        if (fs.isDirectory(path))
                                return true;
                } catch (IOException e) {
                        e.printStackTrace();
                }
               
                String name = path.getName();
                return !name.startsWith(".") && !name.endsWith(".tmp");
        }

        @Override
        public void setConf(Configuration conf) {
                this.conf = conf;
                if (conf != null) {
                        try {
                                fs = FileSystem.get(conf);
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }
        }

}

虽然问题根源找到了,但是有谁知道这个PathFilter,为什么会导致这个错误?以及怎么写这个PathFilter
回复

使用道具 举报

easthome001 发表于 2017-3-17 20:02:00
本帖最后由 easthome001 于 2017-3-17 20:06 编辑
Sno 发表于 2017-3-17 17:23
找到问题根源所在啦,因为要使用flume导入数据到hive,但是会产生.tmp文件,所以我就自己实现了一个PathFil ...

这个应该是在读取hdfs文件列表的时候,对文件格式的一种过滤,比如下面红字,则是把txt过滤掉。楼主应该是把tmp给过滤掉了
//通配符的使用
    public static void list() throws IOException{
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        //PathFilter是过滤布符合置顶表达式的路径,下列就是把以txt结尾的过滤掉
        FileStatus[] status = fs.globStatus(new Path("hdfs://master:9000/user/hadoop/test/*"),new RegexExcludePathFilter(".*txt"));
        //FileStatus[] status = fs.globStatus(new Path("hdfs://master:9000/user/hadoop/test/*"));
        Path[] listedPaths = FileUtil.stat2Paths(status);
        for (Path p : listedPaths) {
            System.out.println(p);
        }
    }
来自HDFS中PathFilter类的作用代码讲解





回复

使用道具 举报

Sno 发表于 2017-3-29 18:39:29
其实是fs.isDirectory(path)这句话抛出异常啦,因为path有些不是hdfs的文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条