当前位置: 首页 > 知识库问答 >
问题:

如何使用Scala模拟Spark DataFrameReader?

周昊乾
2023-03-14

代码示例:

object ConfigurationLoader {

def readTable(tableName: String)(implicit spark: SparkSession): DataFrame = {
    spark.read
      .format("jdbc")
      .option("url", s"$postgresUrl/$postgresDatabase")
      .option("dbtable", tableName)
      .option("user", postgresUsername)
      .option("password", postgresPassword)
      .option("driver", postgresDriver)
      .load()
  }

def loadUsingFilter(dummyFilter: String*)(implicit spark: SparkSession): DataFrame = {
    readTable(postgresFilesTableName)
      .where(col("column").isin(fileTypes: _*))
  }
}

第二个问题--模拟scala对象,似乎需要使用其他方法来创建这样的服务。

共有1个答案

子车英达
2023-03-14

在我看来,单元测试并不意味着测试数据库连接。这应该在集成测试中完成,以检查所有部分是否协同工作。单元测试只是用来测试您的功能逻辑,而不是Spark从数据库中读取的能力。

这就是为什么我会以稍微不同的方式设计您的代码,并且这样做,而不关心DB。

/** This, I don't test. I trust spark.read */
def readTable(tableName: String)(implicit spark: SparkSession): DataFrame = {
    spark.read
    .option(...)
    ...
    .load()
    // Nothing more
}

/** This I test, this is my logic. */
def transform(df : DataFrame, dummyFilter: String*): DataFrame = {
    df
      .where(col("column").isin(fileTypes: _*))
}

然后我在生产中以这种方式使用代码。

val source = readTable("...")
val result = transform(source, filter)
val df = Seq((1, Some("a"), true), (2, Some("b"), false), 
      (3, None, true)).toDF("x", "y", "z")
// and the test
val result = transform(df, filter)
result should be ...
 类似资料:
  • 我试图模拟Scala单例对象。特别是,我需要模拟对象在服务组件(测试中的类)中使用。使用Mockito这是不可能的,测试执行会以以下方式失败: 在这里阅读,Scalamock似乎允许这样做: 要模拟独立的单例对象,请使用。 我的服务组件是这样的: 我的build.sbt有所有这些依赖关系: 但是我找不到这个: 也许这也可以使用EasyMock和PowerMock实现,但我找不到任何Scala示例代

  • 我有一个scala类a,其中有一个方法。 还有一个B类

  • 问题内容: 我有MockRestServiceServer来模拟服务中的restTemplete。但是它总是失败。它显示错误为。任何人都可以让我知道我在哪里做错了。 服务本身将如下所示: 问题答案: 首先,您的类会在每个请求上创建一个RestTemplate的新实例。我不能足够强调这种不良做法。创建一个类型为RestTemplate的bean并将其注入到您的bean中(它很可能已经创建- 取决于您

  • 我如何创建/模拟Spark Scala数据帧与一个案例类嵌套在顶层? 我目前正在单元测试一个在上述模式中输出数据帧的函数。为了检查相等性,我使用了toDF(),不幸的是,它给出了一个在模拟数据帧中的“_id”为nullable=true的模式,从而使测试失败(注意,函数的“实际”输出对所有内容都为nullable=true)。 我还尝试以不同的方式创建模拟数据帧,这导致了错误:https://pa

  • 问题内容: 我只是想知道如何使用JavaScript模拟元素的点击。 目前我有: 但这不起作用:( 有任何想法吗? 问题答案: 这是我煮的 这很简单,但是有效: 用法:

  • 我需要卸载一个静态方法 public TestESMock()引发ConfigurationException{ 有人能告诉我怎么做吗。