为什么在执行某些函数之后使用nullable = true,即使DataFrame中没有NaN值。
val myDf = Seq((2,"A"),(2,"B"),(1,"C"))
         .toDF("foo","bar")
         .withColumn("foo", 'foo.cast("Int"))
myDf.withColumn("foo_2", when($"foo" === 2 , 1).otherwise(0)).select("foo", "foo_2").show现在调用df.printSchema时,nullable将是两列的false。
val foo: (Int => String) = (t: Int) => {
    fooMap.get(t) match {
      case Some(tt) => tt
      case None => "notFound"
    }
  }
val fooMap = Map(
    1 -> "small",
    2 -> "big"
 )
val fooUDF = udf(foo)
myDf
    .withColumn("foo", fooUDF(col("foo")))
    .withColumn("foo_2", when($"foo" === 2 , 1).otherwise(0)).select("foo", "foo_2")
    .select("foo", "foo_2")
    .printSchema然而,现在,nullable至少是一个列的true,这是以前的false。这怎么解释呢?
发布于 2018-04-18 20:41:48
您也可以非常快速地更改dataframe模式。像这样的事就能完成任务-
def setNullableStateForAllColumns( df: DataFrame, columnMap: Map[String, Boolean]) : DataFrame = {
    import org.apache.spark.sql.types.{StructField, StructType}
    // get schema
    val schema = df.schema
    val newSchema = StructType(schema.map {
    case StructField( c, d, n, m) =>
      StructField( c, d, columnMap.getOrElse(c, default = n), m)
    })
    // apply new schema
    df.sqlContext.createDataFrame( df.rdd, newSchema )
}https://stackoverflow.com/questions/40603756
复制相似问题