首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Shell中执行Linux命令

问在Shell中执行Linux命令
EN

Stack Overflow用户
提问于 2020-06-24 22:42:36
回答 1查看 185关注 0票数 2

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

代码语言:javascript
复制
import sys.process._ 

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

我得到了以下错误:

代码语言:javascript
复制
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

我也使用了这个命令,并得到了相同的错误消息:

代码语言:javascript
复制
"sqoop eval --connect jdbc:mysql://localhost:3306/retail_db --username root --password cloudera --query 'select * from categories'".!<

有人能帮我找出错误的原因吗。我试过用单引号和双引号,都没有用。我找遍了所有的地方,但没有找到任何解决办法。所以我才在这里发帖。注意:相同的命令在pyspark中成功执行,如下所示:

代码语言:javascript
复制
>>> import os
>>> import sys

>>> query = "sqoop eval --connect jdbc:mysql://localhost:3306/retail_db --username root --password 
cloudera --query 'select * from categories'" 
>>> os.system(query)
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:28:56 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.13.0
20/06/24 15:28:56 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. 
Consider using -P instead.
20/06/24 15:28:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
----------------------------------------------------
| category_id | category_department_id | category_name        | 
----------------------------------------------------
| 1           | 2           | Football             | 
| 2           | 2           | Soccer               | 
| 3           | 2           | Baseball & Softball  | 
| 4           | 2           | Basketball           | 
| 5           | 2           | Lacrosse             | 
| 6           | 2           | Tennis & Racquet     | 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-25 00:09:23

看起来sqoop不承认*、from和categories是单独的参数。从命令行调用它的原因是,shell解释引号,并将其表示为单个select * from categories参数。换句话说,shell在将所有内容交给sqoop程序之前都会做一些预处理。

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

  1. 您可以直接调用shell并将命令行作为单个参数传递给它,或者
  2. ,您可以自己完成大部分显而易见的预处理。

下面是第二个选项的例子。

代码语言:javascript
复制
Seq("sqoop"
   ,"eval"
   ,"--connect"
   ,"jdbc:mysql://localhost:3306/retail_db"
   ,"--username"
   ,"root"
   ,"--password"
   ,"cloudera"
   ,"--query"
   ,"select * from categories").!

如您所见,所有单个参数都表示为单个参数,包括最后一个参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62565153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档