簡體   English   中英

ScalaTestFailureLocation預期的StructField(value1,ArrayType(StringType,true),false)實際的StructField(val2,ArrayType(StringType,true),true)

[英]ScalaTestFailureLocation Expected StructField(value1,ArrayType(StringType,true),false) Actual StructField(val2,ArrayType(StringType,true),true)

我正在嘗試運行一些測試。 亦即

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()

在上面。 但這不適用於數組。 我還可以做些什么?

嘗試下面的代碼片段,此處將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")))

但是,這不會解決您提到的問題,因為數據框的StructFields在nullable參數中是不同的(StructField構造函數( StructField ): StructField(String name, DataType dataType, boolean nullable, Metadata metadata) )以上給出的答案(使用彼此的架構來創建數據框,應該可以使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM