Переменная доступа, объявленная внутри, соответствует за пределами в scala - PullRequest
0 голосов
/ 06 мая 2020

Я использую метод try and catch для перехвата исключения при чтении файла в Dataframe, используя приведенный ниже код

import scala.io.StdIn
import scala.util.{Try, Success, Failure}
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._

val filename = "s3a://bucketname/moving/file.csv"

def CustomSchemaDataFrame(fileName: String):Try[DataFrame] = {

try {
     val df_custom_schema = spark.read.format("csv").option("header", "true").load(filename) 
      Success(df_custom_schema)
    } catch {
      case unknown: Exception => {
        println(s"Unknown exception: $unknown")
        Failure(unknown)
      }
    }
  }

CustomSchemaDataFrame(filename) match {
  case Success(df_custom_schema) => {
      println("File Read Successfully")
      df_custom_schema.printSchema()
      df_custom_schema.show(true)
  }
  case Failure(ex) => {
      println("error code", ex)
  }
}

то, что я хотел бы выполнить дальше, - это экспортировать df_custom_schema вне побочного соответствия, чтобы выполнить операцию боковое совпадение l oop.

что-то вроде этого ниже

CustomSchemaDataFrame(filename) match {
  case Success(df_custom_schema) => {
      println("File Read Successfully")
      df_custom_schema.printSchema()
      df_custom_schema.show(true)
     val custom_schema = df_custom_schema
  }
  case Failure(ex) => {
      println("error code", ex)
  }
}

custom_schema.printSchema()

, когда я использую выше custom_schema.printSchema () внутри соответствует его работе нормально, но когда я пытаюсь получить к нему доступ вне его ошибки бросания. Есть ли способ получить доступ к значениям вне регистра совпадения. так как я хочу выполнить несколько других операций с этим фреймом данных.

касается махи

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Нет. Вы не можете получить доступ к значениям внутри случая сопоставления с образцом. Это локально для области действия этой функции.

Что вам нужно сделать, так это вернуть результат сопоставления с образцом и продолжить обработку этого результата.

Это не имеет особого смысла однако, поскольку вам нужно вернуть что-то действительное из блоков Success и Failure, тогда вам, вероятно, лучше использовать recoverWith.

Так что обычно вы должны либо сделать что-то вроде

Try {
  spark.read.format("csv").option("header", "true").load(filename)
} match {
  case Success(df) =>
    // ...
    // do all success related stuff to df here
    // ...
  case Failure(t) =>
    println(t)
}

или, если есть какой-то дефолт, который вам нужен в случае сбоя

Try {
  spark.read.format("csv").option("header", "true").load(filename)
}.recoverWith {
  case t =>
    println(t)
    Success(DefaultDF())
}.map { df =>
  // do stuff here
}
0 голосов
/ 06 мая 2020

почему вы не можете просто написать:

val custom_schema= CustomSchemaDataFrame(filename)

custom_schema match {
  case Success(df_custom_schema) => {
      println("File Read Successfully")
      df_custom_schema.printSchema()
      df_custom_schema.show(true)
     val custom_schema = df_custom_schema
  }
  case Failure(ex) => {
      println("error code", ex)
  }
}

custom_schema.get.printSchema()

конечно, вам, возможно, придется проверить успешность custom_schema

if ( custom_schema.isSuccess )
  custom_schema.get.printSchema
...