我正在尝试运行一些测试。即
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)
( 上面给出的答案(使用彼此的架构来创建数据帧(应该有效(。