Как написать тесты Scala для компонента «Запись данных в каталог HDFS»

#scala #dataframe #apache-spark #testing #mocking

Вопрос:

У меня есть простой код, который записывает данные в hdfs в формате csv и parquet, как я могу написать тесты scala здесь, которые могут протестировать нижеприведенный компонент. На самом деле я не могу записать данные в hdfs(в тестах), так как код выполняется в конвейере jules. Любые предложения будут полезны

    df
   .write.format("com.databricks.spark.csv")
   .option("header", "true")
   .mode("append")
   .save(hdfspath)
 

Комментарии:

1. У вас может быть локальный каталог, который служит «поддельным» каталогом kdfw. Просто используйте локальный путь к файлу в своих тестах, и он сразу же должен сработать.

2. Можете ли вы рассказать мне подробно или поделиться ссылкой на какой-нибудь сайт? или пример фрагмента

Ответ №1:

Вы можете записать образец данных со схемой в локальный путь, прочитать его с помощью spark и сравнить ожидаемый и фактический результат.

Вот пример с ScalaTest:

 import org.scalatest.FunSuite
import org.scalatest.Matchers
import org.apache.spark.sql.functions.input_file_name

case class RecordSchema(id: Int, value: String) // define here your real schema

class WriteTest extends FunSuite with Matchers {

    test("test data was written properly") {
        import spark.implicits._
        val path = "local/path/dir"
        val expectedData = List(RecordSchema(1, "dummyValue1"), RecordSchema(2, "dummyValue2"))
        expectedData.toDF
            .write.format("com.databricks.spark.csv")
            .option("header", "true")
            .mode("append")
            .save(path)
        val actualData = spark.read.format("com.databricks.spark.csv")
.load(path)
        
        // test that the data was written as expected
        actualData.as[RecordSchema].collect should contain theSameElementsAs expectedData
    
    }
}
 

Это всего лишь пример, вы можете инкапсулировать компонент записи в отдельный метод (чтобы протестировать его как компонент, а не копировать его код). Пожалуйста, обратите внимание, чтобы записать данные в вашем тесте в новый путь (или удалить содержимое пути заранее в вашем тесте), потому что в противном случае, поскольку он записывает в append режиме, логика этого теста не будет работать.

Комментарии:

1. Спасибо за ответ, но я вообще не могу записывать данные в местоположение HDFS в тестах. Это ограничение, о котором я говорил ранее. Также я отредактировал код и удалил разделение(1), оно не требуется, так как данные огромны и разделены. Как я могу провести тесты в таком случае?

2. Вы можете записать данные в локальную FS вместо hdfs. Я обновляю свой ответ.

3. Извините, я нигде не могу записать данные. Проект будет запущен в рамках проекта jules pipeline.

4. Такого рода ограничения звучат странно. Почему вы не можете писать локально как часть своего конвейера?

5. если у вас есть какие-либо другие предложения, пожалуйста, дайте мне знать