在Scala Shell中执行Linux命令

在Scala Shell中执行Linux命令,scala,apache-spark,sqoop,spark-shell,scala-shell,Scala,Apache Spark,Sqoop,Spark Shell,Scala Shell,我正在从事一个项目,需要在Scala应用程序中执行一些linux命令(sqoop命令)。请参阅我尝试在VM上使用MySql执行的示例命令 import sys.process._ "sqoop eval --connect jdbc:mysql://localhost:3306/retail_db --username root --password cloudera --query 'select * from categories'".! 我得到了以下错误: War

我正在从事一个项目,需要在Scala应用程序中执行一些linux命令(sqoop命令)。请参阅我尝试在VM上使用MySql执行的示例命令

import sys.process._ 

"sqoop eval --connect jdbc:mysql://localhost:3306/retail_db --username root --password cloudera --query 'select * from categories'".!
我得到了以下错误:

Warning: /usr/lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
20/06/24 15:25:27 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.13.0
20/06/24 15:25:27 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. 
Consider using -P instead.
20/06/24 15:25:27 ERROR tool.BaseSqoopTool: Error parsing arguments for eval:
20/06/24 15:25:27 ERROR tool.BaseSqoopTool: Unrecognized argument: *
20/06/24 15:25:27 ERROR tool.BaseSqoopTool: Unrecognized argument: from
20/06/24 15:25:27 ERROR tool.BaseSqoopTool: Unrecognized argument: categories
我也使用了这个命令,得到了相同的错误消息:

"sqoop eval --connect jdbc:mysql://localhost:3306/retail_db --username root --password cloudera --query 'select * from categories'".!<

看起来
sqoop
无法将
*
来自
、以及
类别
识别为单独的参数。当从命令行调用时,它工作的原因是shell解释引号,并将它们表示为单个
select*fromcegories
参数。换句话说,shell在将所有内容交给
sqoop
程序之前会进行一些预处理

方法(即Scala
ProcessBuilder
)直接启动进程,这意味着命令元素不会传递给shell进行预处理。有两种方法可以解决这个问题

  • 您可以直接调用shell并将命令行作为单个参数传递给它,或者
  • 你可以自己做大部分明显的预处理
  • 下面是第二个选项的示例

    Seq("sqoop"
       ,"eval"
       ,"--connect"
       ,"jdbc:mysql://localhost:3306/retail_db"
       ,"--username"
       ,"root"
       ,"--password"
       ,"cloudera"
       ,"--query"
       ,"select * from categories").!
    

    如您所见,所有单独的参数都作为单独的参数显示,包括最后一个。

    谢谢您的回答。请你再详细一点好吗。我从未使用过ProcessBuilder,因此我真的不理解您提供的答案。我复制了你写的和执行的,但是失败了。我试图理解ProcessBuilder,为了能够理解您的答案,我没有得到任何具体的文档来帮助我。我真的很感激你的时间……哦,天哪,它起作用了。你真是个救命恩人。你刚刚救了我一周的头痛。我真的很感激。上帝保佑你。。
    Seq("sqoop"
       ,"eval"
       ,"--connect"
       ,"jdbc:mysql://localhost:3306/retail_db"
       ,"--username"
       ,"root"
       ,"--password"
       ,"cloudera"
       ,"--query"
       ,"select * from categories").!