apache-spark - read - spark sql functions



Änderung der Spark-Dataframe-Spaltennullwert-Eigenschaft (1)

Ich möchte die Nullable-Eigenschaft einer bestimmten Spalte in einem Spark-Dataframe ändern.

Wenn ich das Schema des Datenrahmens drucke, sieht es unten aus. col1: string (nullable = false) col2: string (nullable = true) col3: string (nullable = false) col4: float (nullable = true)

Ich möchte nur col3 Nullable Eigenschaft aktualisiert werden. col1: string (nullable = false) col2: string (nullable = true) col3: string (nullable = true) col4: float (nullable = true)

Ich habe hier online einige Links überprüft, aber es scheint, als würden sie es für alle Spalten tun, aber nicht für eine bestimmte Spalte. Änderung der Nullwert-Eigenschaft der Spalte in Spark Dataframe Kann mir bitte jemand in dieser Hinsicht helfen.


Es gibt keinen "klaren" Weg, dies zu tun. Sie können Trick wie hier verwenden

Relevanter Code aus dieser Antwort:

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

Es würde DataFrame kopieren und das Schema kopieren, aber programmgesteuert nur mit NULL-Werten

Version für viele Spalten:

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

Verwendung: setNullableStateOfColumn (df1, Map ("col1" -> true, "col2" -> true, "col7" -> false));





apache-spark-sql