【问题标题】:Running external unix commands in Scala在 Scala 中运行外部 unix 命令
【发布时间】:2017-05-11 17:20:09
【问题描述】:

尝试通过 Scala 代码运行一些外部命令。

这是其中的一行

import sys.process._
("hdfs dfs -cat /data/test/zipfiletest/filename")!

这里不是直接指定文件名,而是在 scala 变量中使用此文件名。 如何将此文件名附加到现有命令。

试过类似的东西:

("hdfs dfs -cat /data/test/zipfiletest/")+filename!

但这不起作用。 还有其他方法吗?

【问题讨论】:

  • 只使用字符串插值怎么样? (s"hdfs dfs -cat /data/test/zipfiletest/$filename")!

标签: scala unix apache-spark


【解决方案1】:

试试这样:

import sys.process._
(s"hdfs dfs -cat /data/test/zipfiletest/$filename")!

【讨论】:

  • 当我在集群模式下运行包含这个 cat 命令的 spark-job 时,我得到一个错误:I/O error Pipe closed for process: [hdfs, dfs, -cat, /data/test/filename.pgp]。有没有办法解决这个问题?
  • @Rohan Oswal 该命令将根据整个代码在驱动程序或任何工作人员上执行。但我的做法是:我会在 Spark 作业中使用 hadoop api 读取文件,并在您的 spark 集群中使用 broadcast 文件的内容,以便任何工作人员都可以使用它。但我真的不知道你想做什么。
【解决方案2】:

你可以使用字符串插值或字符串连接

字符串插值:

import sys.process._
(s"hdfs dfs -cat /data/test/zipfiletest/$filenameVariable")!

字符串连接:

import sys.process._
("hdfs dfs -cat /data/test/zipfiletest/" + filename)!

我个人会选择字符串插值,更具可读性

【讨论】:

    【解决方案3】:

    您可以使用字符串插值,例如

    s"hdfs dfs -cat $myVariable"
    

    但请注意您的文件名是否包含空格!出于这个原因,您可能更喜欢使用单独获取每个参数的 API 调用来调用 Unix 命令(而不是让 API 分别解析每个参数 - 在上述情况下会失败)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多