ScalaTestFailureLocation Ожидаемый StructField (значение1, ArrayType (StringType, true), false) Фактический StructField (val2, ArrayType (StringType, true), true) - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь запустить несколько тестов. А именно

assertDataFrameEquals(etalon, agg)

на 2 данных. Но получите следующую ошибку

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

Один ДФ создан из списка

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

Другой рассчитывается по некоторым входным файлам.

Если бы value2 был String или каким-либо другим подобным типом, я мог бы сделать

etalon.na.fill()

на это. Но это не работает на массивах. Что еще я могу сделать?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Отвечая на ваш вопрос о том, как заполнить произвольное значение нулевыми массивами. Вы можете сделать 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)) Ответ, приведенный выше (используя схемы друг друга для создания кадра данных, должен работать).

0 голосов
/ 07 сентября 2018

Попробуйте приведенный ниже фрагмент кода, здесь схема agg dataframe применяется к etalon dataframe, чтобы их схема была согласованной.

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

val newSchema = agg.schema

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

assertDataFrameEquals(etalon, agg)
...