为什么在执行某些函数之后使用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。这怎么解释呢?
发布于 2016-11-15 07:04:06
当从静态类型结构(不依赖于Dataset参数)创建schema时,Spark使用一组相对简单的规则来确定nullable属性。
null,那么它的DataFrame表示是nullable。Option[_],那么它的DataFrame表示是nullable,None被认为是SQL NULL。nullable。因为Scala String是java.lang.String,可以是null,所以生成的列可以是nullable。出于同样的原因,bar列是初始数据集中的nullable:
val data1 = Seq[(Int, String)]((2, "A"), (2, "B"), (1, "C"))
val df1 = data1.toDF("foo", "bar")
df1.schema("bar").nullableBoolean = true但foo不是(scala.Int不能是null)。
df1.schema("foo").nullableBoolean = false如果我们将数据定义更改为:
val data2 = Seq[(Integer, String)]((2, "A"), (2, "B"), (1, "C"))foo将是nullable (Integer是java.lang.Integer,装箱整数可以是null):
data2.toDF("foo", "bar").schema("foo").nullableBoolean = true还请参阅:火花-20668修改ScalaUDF以处理空性。
发布于 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
复制相似问题