我试图在Scala中运行gsutil,但除非我明确地将.cmd
放在代码中,否则它不起作用。我不喜欢这种方法,因为我使用的其他人使用Unix系统。我如何让Scala了解gsutil == gsutil.cmd
?我可以编写一个自定义shell脚本并将其添加到路径,但我想要一个不包含脚本的解决方案。
我已经尝试过各种环境变量(使用IntelliJ,不知道它是否相关)。我尝试将/bin
和/platform/gsutil
添加到路径中,两者都不起作用(至少没有.cmd)。我也试过给出完整的路径,看它是否有所作为,但事实并非如此。
以下是使用gsutil的方法:
def readFilesInBucket(ss: SparkSession, bucket: String): DataFrame = {
import ss.implicits._
ss.sparkContext.parallelize((s"gsutil ls -l $bucket" !!).split("\n")
.map(r => r.trim.split(" ")).filter(r => r.length == 3)
.map(r => (r(0), r(1), r(2)))).toDF(Array("Size", "Date", "File"): _*)
}
这是我关于SO的第一个问题,我为可能出现的任何格式错误道歉。
编辑:发现,即使我写这样的脚本:
exec gsutil.cmd "$@"
在同一文件夹中只调用gsutil
,它会像以前一样发出相同的错误消息:java.io.IOException: Cannot run program "gsutil": CreateProcess error=2, The system cannot find the file specified
。
如果我在git bash中编写gsutil
,它会工作,否则在没有脚本的情况下无效。
也许只是使用不同的版本,无论你是在Windows还是* nix系统?
创建一些帮助:
object SystemDetector {
lazy val isWindows = System.getProperty("os.name").startsWith("Windows")
}
然后就像使用它一样:
def readFilesInBucket(ss: SparkSession, bucket: String): DataFrame = {
import ss.implicits._
val gsutil = if(SystemDetector.isWindows) "gsutil.cmd" else "gsutil"
ss.sparkContext.parallelize((s"$gsutil ls -l $bucket" !!).split("\n")
.map(r => r.trim.split(" ")).filter(r => r.length == 3)
.map(r => (r(0), r(1), r(2)))).toDF(Array("Size", "Date", "File"): _*)
}