Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Spark:单元测试-我有一个函数,可以合并3个输入数据集。我应该对它们进行单元测试吗?_Unit Testing_Apache Spark_Apache Spark Sql - Fatal编程技术网

Unit testing Spark:单元测试-我有一个函数,可以合并3个输入数据集。我应该对它们进行单元测试吗?

Unit testing Spark:单元测试-我有一个函数,可以合并3个输入数据集。我应该对它们进行单元测试吗?,unit-testing,apache-spark,apache-spark-sql,Unit Testing,Apache Spark,Apache Spark Sql,我已经写了一段代码,其中的一部分如下 Object Cal{ def mergedatasets(df: Dataset[Row], df1: Dataset[Row],df2: Dataset[Row]):Dataset[Row]={ df.union(df1).union(df2) //other logic } } object readDataframes{ def readFirstDF(spark:SparkSession):Dataset[Row]={ spark.read

我已经写了一段代码,其中的一部分如下

Object Cal{
def mergedatasets(df: Dataset[Row], df1: Dataset[Row],df2: Dataset[Row]):Dataset[Row]={
 df.union(df1).union(df2)
//other logic

}

}
object readDataframes{
def readFirstDF(spark:SparkSession):Dataset[Row]={
 spark.read.json(somefile)
}
def readSecondDF(spark:SparkSession):Dataset[Row]={
 spark.read.json(somefile)
}
def readThirdDF(spark:SparkSession):Dataset[Row]={
 spark.read.json(somefile)
}
}
在上面的代码中,我正在读取3个文件,然后将它们合并成一个文件,以便进一步处理。 基于上述情景,我的问题如下:

  • 对mergdatasets函数进行单元测试有意义吗?如果是,测试的基本/最低要求是什么?如何检查转角情况(如果有)
  • 对readDataframes进行单元测试有意义吗?如果是,测试的目的是什么?检查推断的模式是否如预期的那样?还有别的吗
  • 我还想为以下功能扩展上述问题

    def timeIntervalAgg(df: Dataset[Row]): Dataset[Row] = {
    
        val timeInterval = df
          .groupBy("id","page_number")
          .agg(sum("timeInterval").alias("timeInterval"))
        timeIntervalAgg
    
      }
    
      def timeInterval(df: Dataset[Row]): Dataset[Row] ={
    
        val windowSpec = Window.partitionBy("id").orderBy("date_time")
        val timeFmt = "yyyy-MM-dd'T'HH:mm:ss"
        val endTime = lead(col("date_time"),1).over(windowSpec)
        val startTime = col("date_time")
        val timeDiff = (unix_timestamp(endTime, timeFmt)
          - unix_timestamp(startTime, timeFmt))
        val timeInterval = df
          .withColumn("timeInterval", lit(when(col("event") === "this_event",lit(null)
            .cast("long"))
            .otherwise(timeDiff)))
          .where("""event != "this_event" """)
        timeInterval
    
      }
    
      def addOddpages(df: Dataset[Row]) :Dataset[Row] = {
    
        val odd = df
          .where("""view_mode = "twin" """)
          .withColumn("page_odd", col("page") + 1)
          .drop("page")
          .select(col("id"), col("date_time")
            .cast("timestamp"),col("page_odd")
            .alias("page"), col("page_view_mode"),
            col("event"),col("timeInterval"))
        val timeIntervalWithoddPage = df.union(odd)
        timeIntervalWithoddPage
    
      }
    
    • 请建议是否需要以更好的方式重构代码 以实现更好的测试

    • 我的目标是了解测试的目的是什么?这段时间要注意什么 为上述代码编写测试?所有这些问题都是为了Spark 代码单元测试不是其他语言代码测试

    • 如何进行单元测试而不冗余地测试已经存在的火花 测试
    • 是否需要像这样测试每个函数(因为逻辑/代码不是很复杂),还是最好测试 按适当顺序组合上述函数的函数 那么它可以被称为单元测试吗
    • 请随意分享一些您可能编写的单元测试示例 对于以上代码

    读取JSON文件:如果您只读取JSON文件,则无需对此进行测试。 此外,最好在
    schema()
    中读取带有显式模式的文件,以避免推断模式出现一些问题。此外,读取文件不需要3种相同的方法

    Union数据集:自Spark 2.3.0以来,出现了
    unionByName()
    函数。 该函数按名称(而不是位置)解析列。当数据文件具有不同的列顺序时,可以考虑函数以避免与Enion有关的问题。当然,这个函数不需要测试。很难说
    //方法中的
    mergedatasets()
    代码中的其他逻辑

    对于单元测试,您可以使用ScalaTest或其他工具

    • 使用
      主控(“本地”)
      创建SparkSession
    • 使用预期数据创建数据帧
    • 为要测试的每个方法创建一个输入数据框
    • 比较预期数据帧和实际数据帧

    下面的项目可能有用。您可以在这里找到如何比较两个数据帧。此外,自述文件中还有几个例子:

    我不会对这些方法进行单元测试,
    union
    spark。read
    应该由
    spark
    本身进行单元测试。您可以测试的是参数为null时的行为,即您可以测试是否有适当的异常通过
    readDataframes
    方法没有多大意义,为什么它们将
    dataframes
    作为输入,我希望它们采用文件路径/名称(字符串)?是的,让我为read语句更正这一点