ScalaTestFailureLocation预期的StructField(value1,ArrayType(StringType,true),false)实际的StructField(val2,ArrayType(StringType,true),true)

时间:2018-09-07 14:10:28

标签: arrays scala apache-spark testing null

我正在尝试运行一些测试。即

assertDataFrameEquals(etalon, agg)

在2个数据帧上。但是出现以下错误

ScalaTestFailureLocation
Expected StructField(value1,ArrayType(StringType,true),false)
Actual   StructField(value2,ArrayType(StringType,true),true)

从列表中创建一个df

val etalon= spark.sparkContext.parallelize(data).toDF()

另一个是从某些输入文件中计算出来的。

如果value2是String或其他某种类型,我可以做

etalon.na.fill()

就可以了。但这不适用于数组。我还能做什么?

2 个答案:

答案 0 :(得分:1)

尝试下面的代码片段,此处将agg数据框的架构应用于标准具数据框,以便其架构一致。

var etalon = spark.sparkContext.parallelize(data).toDF()

val newSchema = agg.schema

etalon = spark.createDataFrame(etalon.rdd, newSchema)

assertDataFrameEquals(etalon, agg)

答案 1 :(得分:0)

回答有关如何用任意值填充空数组的问题。您可以制作一个UDF:

tf.Session

之后,您可以使用它:

val replaceNulls = udf{ theArray: Seq[Int] => if (theArray==null) Seq.empty[Int] else theArray }

但是,这不能解决您提到的问题,因为数据帧的StructFields在yourDF.withColumn("nameColumn", replaceNulls(col("arrayColumn")))参数(StructField构造函数(StructField)中有所不同: nullable) 上面给出的答案(使用彼此的架构来创建数据框应该起作用)。