【问题标题】:How to write Scala tests for component "Write data to HDFS directory"如何为组件“将数据写入 HDFS 目录”编写 Scala 测试
【发布时间】:2021-11-20 16:02:03
【问题描述】:

我有一个简单的代码,它以 csv 和 parquet 格式将数据写入 hdfs,我如何在这里编写可以测试以下组件的 scala 测试。由于代码在 jules 管道中运行,我实际上无法将数据写入 hdfs(在测试中)。任何建议都会有所帮助

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

【问题讨论】:

  • 您可以拥有一个本地目录,用作“假”k​​dfw 目录。只需在测试中使用本地文件路径,它就可以立即工作。
  • 你能详细告诉我或分享一些网站链接吗?或示例 sn-p

标签: scala dataframe apache-spark testing mocking


【解决方案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模式写入,所以这个测试的逻辑将无法工作。

【讨论】:

  • 感谢您的回答,但在测试中我根本无法将数据写入 HDFS 位置。这就是我之前所说的限制。此外,我编辑了代码并删除了 repartition(1),因为数据庞大且已分区,因此不需要它。在这种情况下我该如何测试?
  • 您可以将数据写入本地FS而不是hdfs。我更新了我的答案。
  • 对不起,我不能在任何地方写入数据。项目将在 jules 管道中运行。
  • 这种限制听起来很奇怪。为什么不能将本地编写作为管道的一部分?
  • 如果您有任何其他建议,请告诉我
猜你喜欢
  • 1970-01-01
  • 2015-11-29
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多