从Java执行配置单元查询

从Java执行配置单元查询,java,hive,Java,Hive,我试图从Java执行一个小的hive查询,但失败了,出现以下错误,但当我复制同一个查询并在终端上运行时,它给出了结果 有人能帮我吗 Java代码: Runtime.getRuntime().exec("hive -e 'show databases;'"); 抛出错误: FAILED: ParseException line 1:5 cannot recognize input near '<EOF>' '<EOF>' '<

我试图从
Java
执行一个小的
hive查询
,但失败了,出现以下错误,但当我复制同一个查询并在终端上运行时,它给出了结果

有人能帮我吗

Java代码:

Runtime.getRuntime().exec("hive -e 'show databases;'");
抛出错误:

FAILED: ParseException line 1:5 cannot recognize input near '<EOF>' '<EOF>' '<EOF>' in ddl statement
问候,,
GHK.

我已经研究这个Java问题有一段时间了,我相信我已经解决了这个问题。基本上,您失败的原因是环境变量没有正确设置。将以下内容放入
/home//.bash_配置文件中,然后重新启动计算机以修复此问题

HIVE_HOME=/usr/lib/hive

export HIVE_HOME

PATH=$PATH:$HIVE_HOME/bin/hive

export PATH
这将确保它们得到正确设置

但是,尽管这将消除错误,但它仍然不会显示数据库列表,因为运行配置单元命令的进程将在后台运行,而不是在运行主程序的控制台上运行。下面的代码将允许您将程序的输出重定向到主程序运行的控制台

package testing.console;

import java.io.IOException;
import java.lang.ProcessBuilder;
import java.util.Map;

import testing.console.OutputRedirector;

//This Works

public class ConsoleTester {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        ProcessBuilder hiveProcessBuilder = new ProcessBuilder("hive", "-e",
                "show databases");
        String path = processEnv.get("PATH");
        Process hiveProcess = hiveProcessBuilder.start();

        OutputRedirector outRedirect = new OutputRedirector(
                hiveProcess.getInputStream(), "HIVE_OUTPUT");
        OutputRedirector outToConsole = new OutputRedirector(
                hiveProcess.getErrorStream(), "HIVE_LOG");

        outRedirect.start();
        outToConsole.start();    
    }

}
以及用于将输出获取到控制台的OutputRedirector类

package testing.console;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class OutputRedirector extends Thread {

    InputStream is;
    String type;

    public OutputRedirector(InputStream is, String type){
        this.is = is;
        this.type = type;
    }
    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(type + "> " + line);
            }
        } catch (IOException ioE) {

        }
    }

}

我认为这是一个大问题,我尝试了多种方法,但我找不到任何解决方案。我在尝试从bash调用配置单元脚本时遇到了完全相同的问题。如果我找到一个解决方案,我会让你知道,因为它是完全相同的错误,所以它可能有相同的原因。好的,更新我以前的答案。现在,它包含了问题的确切原因、如何解决问题,以及一些使命令按您希望的方式工作的代码。为什么选择路径而不使用它?