我想更改Spark Dataframe中特定列的可空属性。
如果我打印数据框的模式,它看起来如下所示。
col1: string (nullable = false)
col2: string (nullable = true)
col3: string (nullable = false)
col4: float (nullable = true)
我只想更新col3
可空属性。
col1: string (nullable = false)
col2: string (nullable = true)
col3: string (nullable = true)
col4: float (nullable = true)
我在网上查了一些链接,但似乎他们是为所有列而不是特定列,请参阅 Change nullable property of column in spark dataframe。 在这方面,有谁可以帮助我?
答案 0 :(得分:3)
没有“明确”的方法来做到这一点。你可以使用像here
这样的技巧该答案的相关代码:
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和复制模式,但是以编程方式为可编程的 许多专栏的版本: 使用方法:
setNullableStateOfColumn(df1,Map(“col1” - > true,“col2” - > true,“col7” - > false)); 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 )
}