2016-09-27 5 views
0

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

Wenn ich Schema des Datenrahmen drucke zur Zeit sieht es aus wie unten. 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.

Ich habe online hier sind einige Links, aber scheint, wie sie es für alle Spalten tun, aber nicht auf eine bestimmte Spalte. Change nullable property of column in spark dataframe Kann mir bitte jemand in dieser Hinsicht helfen.

+0

Ich führe eine Aktion in einer Spalte mit .withColumn aus. Danach führte ich ein printSchema aus, dann beobachtete ich im Schema, dass Nullable standardmäßig als nullable = true aktualisiert wird. Wie kann ich diesen Nullwert steuern (wahr oder falsch)? – Ramesh

+0

Im Allgemeinen wird der Wert des Attributs 'nullable' durch die Semantik der Eingabe (Primitive/eingepackte Primitive/Option) oder die Funktion, die Sie anwenden, definiert. Daher ist hier eine Aktion wichtig. – zero323

Antwort

2

Es gibt keinen „klar“ Weg, dies zu tun. Sie können Trick wie here

Relevante Code aus dieser Antwort verwenden:

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 Dataframe kopieren würde und kopieren Schema, aber mit specyfying Nullable-programmatisch

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, Karte ("col1" -> true, "col2" -> true, "col7" -> false));

+0

Ich denke, auf diese Weise kann ich den Nullwert von nur einer bestimmten Spalte aus dem Datenrahmen nicht ändern. – Ramesh

+0

Technisch ändern Sie nicht, sondern erstellen ein neues Dataset mit einem neuen Schema. Sehen Sie sich eine Zeile mit 'case StructField' an - es gibt' if' Spaltenname ist gleich Spaltenname von Argument, dann setzen Sie die NULL-Zulässigkeit wie von Parameter angegeben. Wenn nicht, werden die Spaltendaten kopiert. –

+0

Also, wenn ich 4 Spalten in einem Datenframe habe und ich den Nullwert für nur eine Spalte ändern musste. val df2 = df1.withColumn ("col1", udfname (df1, "col1", true)) und dann muss ich diese Methode "setNullableStateOfColumn" über die von mir erstellte udf-Funktion aufrufen? – Ramesh

Verwandte Themen