scala - 在 Scala-Shell 中执行 Linux 命令

标签 scala apache-spark sqoop spark-shell scala-shell

我正在开发一个项目,需要在我的 Scala 应用程序中执行一些 Linux 命令(sqoop 命令)。请参阅我尝试在虚拟机上使用 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 无法将 *fromcategories 识别为单独的参数。从命令行调用时它起作用的原因是 shell 解释引号并将它们呈现为单个 select * fromcategories 参数。换句话说,shell 在将所有内容交给 sqoop 程序之前会进行一些预处理。

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

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

这是第二个选项的示例。

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

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

关于scala - 在 Scala-Shell 中执行 Linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62565153/

相关文章:

scala - java.io.Serialized 和 GenTraversableOnce 类型不匹配

java - Scala Actor 效率低下问题

apache-spark - Scala Spark:找到json的多个来源

java - 使用 scala 将应用程序参数传递给 Spark-Submit 时出现问题

scala - Ubuntu下安装IntelliJ + Scala

python - PySpark:添加一个新列,其中包含从列创建的元组

python - Spark write parquet 不写任何文件,只有_SUCCESS

hadoop - Sqoop中的时间戳截断

hadoop - Sqoop 导入错误 : org. apache.hadoop.security.AccessControlException: Permission denied by sticky bit

twitter - 如何在 HDFS 中存储推文?