我有一个运行 Java 操作的 oozie 工作流。在 java 操作中,我需要描述一个 Hive 表来获取表的架构。我通过使用流程构建器并执行包含describe table query
我的 describeTable.sh:
hive -e 'describe <tableName>`
一旦 java 代码生成了这个脚本,我将它复制到/tmp
本地 FS 上,然后使用 process builder 执行脚本,如下所示:
fs.copyToLocalFile(bashScriptPath, new Path("/tmp/describeTable.sh"));
ProcessBuilder builder = new ProcessBuilder("bash", "/tmp/describeTable.sh");
脚本执行,但无法识别hive
为命令
/tmp/describeTable.sh: line 1: hive: command not found
我也试过/usr/bin/hive -e 'describe <tableName>'
了,但效果不好。
当我在本地 FS 上将 java 程序作为 jar 文件执行时,它可以正常工作,但是当我将它作为 oozie 工作流的一部分运行时,它会失败。
我不知道如何让这个工作,我真的很感激一些想法。
编辑
添加流程构建器的完整代码:
fs.copyToLocalFile(bashScriptPath, new Path("/tmp/describeTable.sh"));
ProcessBuilder builder = new ProcessBuilder("bash", "/tmp/describeTable.sh");
builder.directory(new File(currentLocalDir));
ArrayList<String> columnList = new ArrayList<String>();
System.err.println("trying to run script");
try {
final Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
BufferedReader error1 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String errorLine=null;
System.err.println("error stream: ");
while((errorLine=error1.readLine())!=null){
System.err.println(errorLine);
}
String line;
System.err.println("input stream");
while((line=br.readLine())!=null) {
System.err.println("line from running script: " + line);
String[] output = line.split("\t");
columnList.add(output[0]);
}
is.close();
isr.close();
br.close();
System.err.println("column list:" + columnList);
return columnList;