我想更改Spark Dataframe中特定列的nullable属性。
如果我打印当前数据框架的模式,它看起来如下所示:
col1: string (nullable = false)
col2: string (nullable = true)
col3: string (nullable = false)
col4: float (nullable = true)
我只是想要col3
nullable属性更新。
col1: string (nullable = false)
col2: string (nullable = true)
col3: string (nullable = true)
col4: float (nullable = true)
我在网上查了一下,这里有一些链接,但似乎他们对所有列都这样做,而不是对特定的列,见改变spark数据框架中列的可空属性。有人能在这方面帮助我吗?
没有"明确"的方法来做到这一点。你可以使用像这样的技巧
答案的相关代码:
def setNullableStateOfColumn( df: DataFrame, cn: String, nullable: Boolean) : DataFrame = {
// get schema
val schema = df.schema
// modify [[StructField] with name `cn`
val newSchema = StructType(schema.map {
case StructField( c, t, _, m) if c.equals(cn) => StructField( c, t, nullable = nullable, m)
case y: StructField => y
})
// apply new schema
df.sqlContext.createDataFrame( df.rdd, newSchema )
}
它将复制DataFrame和复制模式,但是以编程方式指定可空
多列版本:
def setNullableStateOfColumn(df: DataFrame, nullValues: Map[String, Boolean]) : DataFrame = {
// get schema
val schema = df.schema
// modify [[StructField]s with name `cn`
val newSchema = StructType(schema.map {
case StructField( c, t, _, m) if nullValues.contains(c) => StructField( c, t, nullable = nullValues.get(c), m)
case y: StructField => y
})
// apply new schema
df.sqlContext.createDataFrame( df.rdd, newSchema )
}
用法:setNullableStateOfColumn(df1, Map ("col1" -> true, "col2" -> true, "col7" -> false));