我正在尝试运行一些测试。即
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()
就可以了。但这不适用于数组。我还能做什么?
答案 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
)
上面给出的答案(使用彼此的架构来创建数据框应该起作用)。