Spark Dataframe列可以为属性更改

时间:2016-09-27 21:17:35

标签: scala apache-spark apache-spark-sql

我想更改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。 在这方面,有谁可以帮助我?

1 个答案:

答案 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和复制模式,但是以编程方式为可编程的

许多专栏的版本:

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