在 Scala 中执行 Linux 命令-Shell
Executing Linux Command in 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'".!
我收到以下错误:
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'".!<
谁能帮我找出错误的原因。我试过使用单引号和双引号,都无济于事。我到处搜索,但找不到任何解决方案。这就是我在这里发帖的原因。
注意:在 pyspark 中成功执行了相同的命令,如下所示:
>>> 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 |
sqoop
似乎无法将 *
、from
和 categories
识别为单独的参数。从命令行调用时它起作用的原因是 shell 解释引号并将它们呈现为单个 select * from categories
参数。换句话说,shell 在将所有内容交给 sqoop
程序之前会进行一些预处理。
.!
方法(即 Scala ProcessBuilder
)直接启动进程,这意味着命令元素不会传递给 shell 进行预处理。有两种方法可以解决这个问题。
- 您可以直接调用 shell 并将命令行作为单个参数传递给它,或者
- 您可以自己完成大部分明显的预处理。
这是第二个选项的示例。
Seq("sqoop"
,"eval"
,"--connect"
,"jdbc:mysql://localhost:3306/retail_db"
,"--username"
,"root"
,"--password"
,"cloudera"
,"--query"
,"select * from categories").!
如您所见,所有单独的参数都作为单独的参数显示,包括最后一个。
我正在做一个项目,我需要在我的 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'".!<
谁能帮我找出错误的原因。我试过使用单引号和双引号,都无济于事。我到处搜索,但找不到任何解决方案。这就是我在这里发帖的原因。 注意:在 pyspark 中成功执行了相同的命令,如下所示:
>>> 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 |
sqoop
似乎无法将 *
、from
和 categories
识别为单独的参数。从命令行调用时它起作用的原因是 shell 解释引号并将它们呈现为单个 select * from categories
参数。换句话说,shell 在将所有内容交给 sqoop
程序之前会进行一些预处理。
.!
方法(即 Scala ProcessBuilder
)直接启动进程,这意味着命令元素不会传递给 shell 进行预处理。有两种方法可以解决这个问题。
- 您可以直接调用 shell 并将命令行作为单个参数传递给它,或者
- 您可以自己完成大部分明显的预处理。
这是第二个选项的示例。
Seq("sqoop"
,"eval"
,"--connect"
,"jdbc:mysql://localhost:3306/retail_db"
,"--username"
,"root"
,"--password"
,"cloudera"
,"--query"
,"select * from categories").!
如您所见,所有单独的参数都作为单独的参数显示,包括最后一个。