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个文件,然后将它们合并成一个文件,以便进一步处理。
基于上述情景,我的问题如下:
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 代码单元测试不是其他语言代码测试
- 如何进行单元测试而不冗余地测试已经存在的火花 测试
- 是否需要像这样测试每个函数(因为逻辑/代码不是很复杂),还是最好测试 按适当顺序组合上述函数的函数 那么它可以被称为单元测试吗
- 请随意分享一些您可能编写的单元测试示例 对于以上代码
schema()
中读取带有显式模式的文件,以避免推断模式出现一些问题。此外,读取文件不需要3种相同的方法
Union数据集:自Spark 2.3.0以来,出现了unionByName()
函数。
该函数按名称(而不是位置)解析列。当数据文件具有不同的列顺序时,可以考虑函数以避免与Enion有关的问题。当然,这个函数不需要测试。很难说//方法中的mergedatasets()
代码中的其他逻辑
对于单元测试,您可以使用ScalaTest或其他工具
- 使用
主控(“本地”)
创建SparkSession李>
- 使用预期数据创建数据帧李>
- 为要测试的每个方法创建一个输入数据框李>
- 比较预期数据帧和实际数据帧李>
下面的项目可能有用。您可以在这里找到如何比较两个数据帧。此外,自述文件中还有几个例子:我不会对这些方法进行单元测试,union
和spark。read
应该由spark
本身进行单元测试。您可以测试的是参数为null时的行为,即您可以测试是否有适当的异常通过readDataframes
方法没有多大意义,为什么它们将dataframes
作为输入,我希望它们采用文件路径/名称(字符串)?是的,让我为read语句更正这一点