Hive源码阅读--作业的执行--processCmd

在processCmd方法中,主要流程有:

  • 去除命令中的注释;
  • 如果命令是quitexit,则退出;
  • 如果命令是source开头,则校验source命令后面的文件是否存在,存在则执行processFile
  • 如果命令是以感叹号!开头,表明是shell命令,这时候直接调用shell命令执行器执行;
  • 如果以上都不是,则说明是本地模式。然后获得命令处理器,并调用processLocalCmd执行命令。

这里说出了processCmd向后的两个方向,第一个方向是processFile,用于执行文件,第二个方向是processLocalCmd,用于执行命令。

   public int processCmd(String cmd) {
   		// CliSessionState 对象不再赘述
        CliSessionState ss = (CliSessionState)SessionState.get();
        ss.setLastCommand(cmd);
        ss.updateThreadName();
        // 刷新打印流,防止上个命令输出
        ss.err.flush();
        String cmd_trimmed = cmd.trim();
        // tokenizeCmd将用户输入的指令从空格,制表符等出断开,得到token数组
        String[] tokens = this.tokenizeCmd(cmd_trimmed);
        int ret = 0;
        // 如果命令是`quit`或`exit`,则退出
        if (!cmd_trimmed.toLowerCase().equals("quit") && !cmd_trimmed.toLowerCase().equals("exit")) {
            String shell_cmd;
            // 如果命令是`source`开头,则校验`source`命令后面的文件是否存在,存在则执行`processFile`
            if (tokens[0].equalsIgnoreCase("source")) {
                shell_cmd = this.getFirstCmd(cmd_trimmed, tokens[0].length());
                shell_cmd = (new VariableSubstitution(new HiveVariableSource() {
                    public Map<String, String> getHiveVariable() {
                        return SessionState.get().getHiveVariables();
                    }
                })).substitute(ss.getConf(), shell_cmd);
                File sourceFile = new File(shell_cmd);
                // 如果source后跟的参数不是文件,就报错
                if (!sourceFile.isFile()) {
                    this.console.printError("File: " + shell_cmd + " is not a file.");
                    ret = 1;
                } else {
                    try {
                    	// 不管再多操作,只要他是文件,最后也是交给processFile去执行
                        ret = this.processFile(shell_cmd);
                    } catch (IOException var11) {
                    	// 处理失败了会输出报错的原因
                        this.console.printError("Failed processing file " + shell_cmd + " " + var11.getLocalizedMessage(), StringUtils.stringifyException(var11));
                        ret = 1;
                    }
                }
            // 如果命令是以感叹号!开头,表明是`shell`命令,这时候直接调用`shell`命令执行器执行
            } else if (cmd_trimmed.startsWith("!")) {
                shell_cmd = cmd_trimmed.substring(1);
                shell_cmd = (new VariableSubstitution(new HiveVariableSource() {
                    public Map<String, String> getHiveVariable() {
                        return SessionState.get().getHiveVariables();
                    }
                })).substitute(ss.getConf(), shell_cmd);

                try {
                    ShellCmdExecutor executor = new ShellCmdExecutor(shell_cmd, ss.out, ss.err);
                    ret = executor.execute();
                    if (ret != 0) {
                        this.console.printError("Command failed with exit code = " + ret);
                    }
                } catch (Exception var10) {
                    this.console.printError("Exception raised from Shell command " + var10.getLocalizedMessage(), StringUtils.stringifyException(var10));
                    ret = 1;
                }
            } else {
                try {
                    CommandProcessor proc = CommandProcessorFactory.get(tokens, (HiveConf)this.conf);
                    // 去除上面各种类型,其他sql的主要执行方法为processLocalCmd
                    ret = this.processLocalCmd(cmd, proc, ss);
                } catch (SQLException var9) {
                    this.console.printError("Failed processing command " + tokens[0] + " " + var9.getLocalizedMessage(), StringUtils.stringifyException(var9));
                    ret = 1;
                }
            }
        } else {
            ss.close();
            System.exit(0);
        }

        ss.resetThreadName();
        // 如果最后返回的ret为1,那么就表示执行失败。
        return ret;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Hive是一个基于Hadoop的数据仓库基础结构,它提供了SQL查询和数据分析功能。Hive的源代码阅读是指对Hive项目的源代码进行逐行分析和理解,以深入了解Hive的内部工作原理和实现细节。 Hive的源代码阅读可以从导读开始。导读部分是Hive代码仓库中的一些重要文档和指南,它们提供了关于Hive项目的概述和指导。 首先,我们可以阅读Hive项目的README文件。该文件通常包含了对项目的介绍、功能特点和使用说明。README文件一般会介绍Hive的目标、核心组件和HiveQL查询语言等内容,为我们提供了整体了解Hive的入口。 接下来,我们可以查看Hive项目中的文档目录。在这个目录下,我们可以找到各种文档、指南和设计文档,它们详细描述了Hive的不同方面和内部机制。这些文档可以帮助我们了解Hive的体系结构、数据处理流程、优化技巧等内容,为后续阅读源代码提供了必要的背景知识。 此外,还可以关注Hive项目的WIKI页面。Hive的WIKI页面常常有丰富的内容,包括开发指南、常见问题解答等。这些页面中提供了一些较为具体和实用的信息,可以帮助我们更好地理解Hive的源代码。 在阅读Hive源代码时,我们应该注重核心模块和关键类的分析。可以从查询解析器、查询优化器和执行引擎等模块开始阅读。这些模块负责将HiveQL查询转化为Hadoop任务并执行查询操作。 最后,我们还可以参考Hive源代码中的注释和代码文档。良好的代码注释可以帮助我们理解代码的意图和实现细节,而代码文档则可以提供更加详细的说明和使用方法。 综上所述,Hive源码阅读的导读包括了阅读README文件、查看文档目录和WIKI页面、重点关注核心模块和关键类的分析,以及参考代码注释和文档等内容。通过导读,我们可以为接下来的源码阅读做好准备,更好地理解Hive的工作原理和实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值