Как написать модульный тест для чтения приложений Spark из файла json - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть простое приложение Spark в scala. Сейчас я хочу, чтобы мое приложение spark просто создавало sparkSession и считывало файл Json в DataFrame.

object SparkAppExample {

def main(args: Array[String]): Unit = {
val sparkSession = SparkSession.builder()
      .appName("Spark Scala  Example")
      .getOrCreate()
val records: DataFrame = sparkSession.read.json("records.jsonl")
}
}

Как написать для этого юнит-тесты? Я могу создать фрейм данных для тестирования, используя

val dummy: DataFrame = sparkSession.createDataFrame(Seq(
      ("BABY", "videos", "0.5"),
      ("APPLIANCES AND STORAGE", "audios", "0.6")
    ))

Теперь я действительно хочу вызвать SparkAppExample.main(Array.empty[String]) в моем модульном тесте, а затем смоделировать sparkSession.read.json вызов, чтобы вернуть фиктивный фрейм данных, который я создал выше.

1 Ответ

0 голосов
/ 10 апреля 2020

Вы можете абстрагироваться от различий между вашим приложением и тестом, таких как SparkSession и путь к данным. Как:

trait SparkApp {
    val sparkSession = SparkSession.builder().getOrCreate()
}

object SparkExampleJob extends SparkApp {
    def getRecords(path: String, sparkSession: SparkSession) = sparkSession.read.json(path)
}

и в ваших тестах:

trait TestUtils extends FunSuite with BeforeAndAfterAll with Matchers  {
    val sparkTestSession = SparkSession.builder().getOrCreate()
}

class SparkAppTest extends TestUtils {

    test("read JSON") {
        val path = "/my/test.json"
        val expectedOutput = List(...)
        SparkExampleJob.getRecords(path, sparkTestSession).collect.toList should equal expectedOutput 
    }
}
...