ScalaTestFailureLocation Expected StructField(value1,ArrayTy



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

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 是字符串或其他类似类型,我可以做

etalon.na.fill()

在上面。但这不适用于数组。我还能做什么?

尝试下面的代码片段,这里 agg 数据帧的架构正在应用于标准具数据帧,以便它们的架构保持一致。

var etalon = spark.sparkContext.parallelize(data).toDF()
val newSchema = agg.schema
etalon = spark.createDataFrame(etalon.rdd, newSchema)
assertDataFrameEquals(etalon, agg)

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

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

之后,您可以使用它:

yourDF.withColumn("nameColumn", replaceNulls(col("arrayColumn")))

但是,这并不能解决您提到的问题,因为数据帧的结构字段在nullable参数(结构字段构造函数(StructField(:StructField(String name, DataType dataType, boolean nullable, Metadata metadata)( 上面给出的答案(使用彼此的架构来创建数据帧(应该有效(。

相关内容

  • 没有找到相关文章

最新更新