Как запустить gsutil из Scala без суффикса .cmd? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь запустить gsutil в Scala, но это не сработает, если я не введу явно код .cmd в коде.Мне не нравится этот подход, так как другие, с которыми я работаю, используют системы Unix.Как мне дать Скале понять это gsutil == gsutil.cmd?Я мог бы просто написать собственный сценарий оболочки и добавить его в путь, но я бы хотел решение, которое не включает сценарии.

Я уже пробовал с различными переменными среды (с использованием 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"): _*)
}

Это мой первый вопрос оИтак, я прошу прощения за любые ошибки форматирования, которые могут быть.


РЕДАКТИРОВАТЬ: обнаружил, что даже когда я пишу сценарий, как это:

exec gsutil.cmd "$@"

называется просто gsutilв той же папке он выдает то же сообщение об ошибке, что и раньше: java.io.IOException: Cannot run program "gsutil": CreateProcess error=2, The system cannot find the file specified.

Это работает, если я пишу gsutil в git bash, что в противном случае не работало бы без скрипта.

1 Ответ

2 голосов
/ 24 апреля 2019

Может быть, просто использовать другую версию, независимо от того, используете ли вы 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"): _*)
   }
...