如何使用Java运行hdfs cat命令并读取输出文件

vddsk6oq  于 2022-12-09  发布在  HDFS
关注(0)|答案(2)|浏览(253)

我需要运行以下命令“hdfs dfs -cat /user/username/data/20220815/EDHSB. CSV”,该命令显示CSV文件的内容(存在于远程HDFS中)。
为了实现以上我使用了下面的代码:

try{
    String shpath="hdfs dfs -cat /user/username/data/20220815/EDHSB.CSV";
    Process ps = Runtime.getRuntime().exec(shpath);  
    ps.waitFor();  
    }
    catch (Exception e) {  
    e.printStackTrace();  
    }

下一步是从上面的代码中读取CSV文件。第一步是否足够好,或者是否有其他方法可以完成整个流程...

5anewei6

5anewei61#

您应该改用java.lang.Processjava.lang.ProcessBuilder,因为这样可以直接在Java代码中截取输出。
基本上看起来像这样

final var process = new ProcessBuilder( "hdfs", "dfs", "-cat", "/user/username/data/20220815/EDHSB.CSV" )
  .start();
final String csvFileContents; 
try( var inputStream = process.getInputStream();
  var reader = new BufferedReader( new InputStreamReader( inputStream ) )
{
  csvFileContents = lines.collect( Collectors.joining( "\n" ) );
}

为了便于阅读,省略了所有必要的错误处理...

jdzmm42g

jdzmm42g2#

关于代码有两点:
1.最好 * 不要 * 调用printStackTrace(),因为它很容易被忽略。对异常做一些有意义的事情。如果你不能,就在异常的签名中添加一个throws子句,让异常从你的方法中出来。
1.你真的想在开始阅读之前通过调用waitFor()来等待进程完成吗?如果你这样做,并且文件非常大,你可能会丢失一些内容,因为Java运行时的缓冲区有限。相反,获得它的输入流并立即开始处理它。当进程退出时,你会得到一个EOF条件。

void processCSV() throws IOException {
    String shpath="hdfs dfs -cat /user/username/data/20220815/EDHSB.CSV";
    Process ps = Runtime.getRuntime().exec(shpath);
    try (Stream<String> lines = ps.inputReader().lines()) {
        lines.forEach(line -> {
            processCSVLine(line);
        }
    }
}

相关问题