如何模拟sqlcontext.read.parquet()?

i2byvkas  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(382)
class Test{
override def execute(sqlContext: SQLContext) {
  val df: DataFrame = sqlContext.read.parquet(path)
}

如何模仿sqlcontext.read.parquet?需要从json中读取并在调用时返回伪Dataframe

class XTest extends FunSuite with MockitoSugar {

test("Test") {

val sparkSession = SparkSession
  .builder()
  .master("local[*]")
  .appName("View_Persistence_Spark_Job")
  .getOrCreate()
sparkSession.sparkContext.setLogLevel("ERROR")

val test = new Test()
val df_from_json = sparkSession.read.option("multiline", "true").json("src/test/resources/test.json")
    val mockContext = mock[SQLContext]
        when(mockContext.read.parquet("src/test/resources/test.json")).thenReturn(df_from_json)
    test.execute(sparkSession.sqlContext)
tuwxkamq

tuwxkamq1#

有两个问题需要从你的例子中理解。
首先,在使用mock时不能连接调用。尝试:

when(mockContext.read.parquet("src/test/resources/test.json"))

总是会失败因为结果 mockContext 不实现方法read,因此将导致空引用异常。为了解决这个问题,我们需要添加另一个mock,这将是 mockContext.read . 因此,这一部分将是:

val mockContext = mock[SQLContext]
val dataFrameReader = mock[DataFrameReader]

when(mockContext.read).thenReturn(dataFrameReader)
when(dataFrameReader.parquet("src/test/resources/test.json")).thenReturn(df_from_json)

第二件事,为了 test 用那个嘲弄,你要把它传给他,而不是 sparkSession.sqlContext ,这不是一个mock,因此不能重写它的行为。
综上所述,完整的测试将是:

test("Test") {

  val sparkSession = SparkSession
    .builder()
    .master("local[*]")
    .appName("View_Persistence_Spark_Job")
    .getOrCreate()
  sparkSession.sparkContext.setLogLevel("ERROR")

  val test = new Test()
  val df_from_json: sql.DataFrame = sparkSession.read.option("multiline", "true").json("src/test/resources/test.json")
  val mockContext = mock[SQLContext]
  val dataFrameReader = mock[DataFrameReader]

  when(mockContext.read).thenReturn(dataFrameReader)
  when(dataFrameReader.parquet("src/test/resources/test.json")).thenReturn(df_from_json)
  test.execute(mockContext)
}

相关问题