scala - change - spark withcolumnrenamed multiple




Ändern der Nullwerteigenschaft der Spalte im Spark-Dataframe (4)

Ich erstelle manuell einen Datenrahmen für einige Tests. Der Code zum Erstellen ist:

case class input(id:Long, var1:Int, var2:Int, var3:Double)
val inputDF = sqlCtx
  .createDataFrame(List(input(1110,0,1001,-10.00),
    input(1111,1,1001,10.00),
    input(1111,0,1002,10.00)))

Also sieht das Schema so aus:

root
 |-- id: long (nullable = false)
 |-- var1: integer (nullable = false)
 |-- var2: integer (nullable = false)
 |-- var3: double (nullable = false)

Ich möchte für jede dieser Variablen "nullable = true" machen. Wie deklariere ich dies von Anfang an oder wechsle es in einen neuen Datenrahmen, nachdem es erstellt wurde?


Dies ist eine späte Antwort, aber wollte eine alternative Lösung für Leute, die hierher kommen, geben. Sie können eine DataFrame Column automatisch von Anfang an durch die folgende Änderung Ihres Codes auf DataFrame :

case class input(id:Option[Long], var1:Option[Int], var2:Int, var3:Double)
val inputDF = sqlContext
  .createDataFrame(List(input(Some(1110),Some(0),1001,-10.00),
    input(Some(1111),Some(1),1001,10.00),
    input(Some(1111),Some(0),1002,10.00)))
inputDF.printSchema

Dies wird ergeben:

root
 |-- id: long (nullable = true)
 |-- var1: integer (nullable = true)
 |-- var2: integer (nullable = false)
 |-- var3: double (nullable = false)

defined class input
inputDF: org.apache.spark.sql.DataFrame = [id: bigint, var1: int, var2: int, var3: double]

Wenn Sie ein Feld als eine Option deklarieren, indem Sie Some([element]) oder None als die tatsächlichen Eingaben verwenden, kann das Feld im Wesentlichen Nullwert sein. Andernfalls wird das Feld nicht nullfähig sein. Ich hoffe das hilft!


Eine kompaktere Version zum Festlegen aller Parameter, die keine NULL-Werte haben

Statt case StructField( c, t, _, m) ⇒ StructField( c, t, nullable = nullable, m) kann man _.copy(nullable = nullable) . Dann kann die ganze Funktion geschrieben werden als:

def setNullableStateForAllColumns( df: DataFrame, nullable: Boolean) : DataFrame = {
  df.sqlContext.createDataFrame(df.rdd, StructType(df.schema.map(_.copy(nullable = nullable))))
}

Verwenden Sie einfach java.lang.Integer anstelle von scala.Int in Ihrer Fallklasse.

case class input(id:Long, var1:java.lang.Integer , var2:java.lang.Integer , var3:java.lang.Double)

Eine andere Option, wenn Sie den Datenrahmen direkt ändern müssen und das erneute Erstellen unmöglich ist, können Sie Folgendes tun:

.withColumn("col_name", when(col("col_name").isNotNull, col("col_name")).otherwise(lit(null)))

Spark wird dann denken, dass diese Spalte null enthalten kann, und Nullgültigkeit wird auf true . Sie können auch udf , um Ihre Werte in Option zu verpacken. Funktioniert auch für Streaming-Fälle.





spark-dataframe