代码之家  ›  专栏  ›  技术社区  ›  Evgenii

ScalaTestFailureLocation需要StructField(value1,ArrayType(StringType,true),false)实际StructField(val2,ArrayType(StringType,true),true)

  •  0
  • Evgenii  · 技术社区  · 6 年前

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

    在上面。但这对数组不起作用。我还能做什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Mansoor Baba Shaik    6 年前

    var etalon = spark.sparkContext.parallelize(data).toDF()
    
    val newSchema = agg.schema
    
    etalon = spark.createDataFrame(etalon.rdd, newSchema)
    
    assertDataFrameEquals(etalon, agg)
    
        2
  •  0
  •   Guasacaca    6 年前

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

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

    之后,您可以使用它:

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

    nullable 参数(StructField构造函数( StructField ): StructField(String name, DataType dataType, boolean nullable, Metadata metadata) 上面给出的答案(使用彼此模式来创建数据帧应该是可行的)。