#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. если у вас есть какие-либо другие предложения, пожалуйста, дайте мне знать