我可以通过spark-scala程序运行shell脚本吗?

时间:2016-10-26 20:43:15

标签: scala hadoop apache-spark intellij-idea spark-dataframe

我正在intelligi中编写一个spark-scala程序,我的代码基本上是从oracle中提取表并将它们作为文本文件insert_df.rdd.saveAsTextFile("hdfs://path")存储在hdfs中。我试过这种方式,但它不起作用val script_sh = "///samplepath/file_creation_script.sh".!

但我对我生成的文本文件进行了一些转换,我写了一个shell脚本。我不想分别运行spark jar文件和.sh文件。

如果有任何方法我可以通过该程序调用shell脚本,请告诉我。

2 个答案:

答案 0 :(得分:1)

如果要将命令的输出保存到变量,则需要使用:

import sys.process._
val result = "/path/to/your/script.sh".!! ("!" just execute the command)

这可以像解决方法一样工作:

import java.io.{BufferedReader, InputStreamReader}

  val p = new ProcessBuilder("/bin/bash","/path/to/your/script")
  val p2 = p.start()
  val br = new BufferedReader(new InputStreamReader(p2.getInputStream()))

  var line:String = ""
  while ({line = br.readLine();  line!= null}) {
    println(line)
  }

答案 1 :(得分:0)

我想说只尝试使用spark API。

如果你想从spark(1)和(2)为我工作

触发shell脚本
  1. 在客户端模式下:
  2. 只需从spark代码

    运行shell脚本

    val cmd =“home / some_script.sh”

    CMD!

    1. 在群集模式下:
    2. 我通常使用Oozie,将.sh文件保存在工作流的/ lib文件夹中,这会将脚本复制到容器中。

      来自代码调用

      val cmd =“./ some_script.sh”

      CMD!

      对于python“。”不需要

      val cmd =“python some_script.py”

      CMD!

      1. 如果使用spark-submit使用--files将脚本复制到容器。
      2. 没试过3,可以尝试分享。