我可以通过spark scala程序运行shell脚本吗?
我正在用intelligi编写一个spark scala程序,我的代码基本上是从oracle中获取表,并将它们作为文本文件存储在hdfs中我可以通过spark scala程序运行shell脚本吗?,scala,hadoop,apache-spark,intellij-idea,spark-dataframe,Scala,Hadoop,Apache Spark,Intellij Idea,Spark Dataframe,我正在用intelligi编写一个spark scala程序,我的代码基本上是从oracle中获取表,并将它们作为文本文件存储在hdfs中insert_df.rdd.saveAsTextFile(“hdfs://path)。我尝试过这种方法,但没有成功val script\u sh=“///samplepath/file\u creation\u script.sh” 但是我需要对生成的文本文件进行一些转换,我为此编写了一个shell脚本。我不想分别运行spark jar文件和.sh文件 请告诉
insert_df.rdd.saveAsTextFile(“hdfs://path)
。我尝试过这种方法,但没有成功val script\u sh=“///samplepath/file\u creation\u script.sh”代码>
但是我需要对生成的文本文件进行一些转换,我为此编写了一个shell脚本。我不想分别运行spark jar文件和.sh
文件
请告诉我是否有任何方法可以通过该程序调用shell脚本。我想说,请尝试仅使用spark API
不过,如果你想触发spark(1)和(2)的shell脚本,它对我来说是有效的
在客户端模式下:
只需从spark代码运行shell脚本
val cmd=“home/some_script.sh”
指令
在群集模式下:
我通常使用Oozie,将.sh文件保存在工作流的/lib文件夹中,这会将脚本复制到容器中
从代码调用
val cmd=“/some_script.sh”
指令
对于python,不需要“.”
val cmd=“python some_script.py”
指令
如果使用spark submit,请使用--files将脚本复制到容器中
尚未尝试3,可以尝试并共享。如果要将命令的输出保存到需要使用的变量中,请执行以下操作:
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)
}
你能试试df.write.text(“/hdfs/path”)