2017-10-28 3 views
0

Lesen Spark-Dokument erste Funktion, es erwähnt IgnoreNulls würde ersten nicht null Wert erhalten.DataFrame erste Funktion ignoreNulls funktioniert nicht

import org.apache.spark.sql.SparkSession 
import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.expressions.{Window, WindowSpec} 

object tmp { 
    def main(args: Array[String]): Unit = { 
    val spark = SparkSession.builder().master("local") getOrCreate() 
    import spark.implicits._ 

    val input = Seq(
     (1234, 1, None), 
     (1234, 2, Some(1)), 

     (5678, 1, Some(11)), 
     (5678, 2, Some(22)) 
    ).toDF("service_id", "counter", "value") 

    lazy val window: WindowSpec = Window.partitionBy("service_id").orderBy("counter") 
    val firsts = input.withColumn("first_value", first("value", ignoreNulls = true).over(window)) 
    firsts.orderBy("service_id", "counter").show() 
    } 
} 

Dies gibt folgenden Ausgang zurück. Ich möchte Nullwert in der ersten Reihe für FIRST_VALUE 1. Bin ich etwas

+----------+-------+-----+-----------+ 
|service_id|counter|value|first_value| 
+----------+-------+-----+-----------+ 
|  1234|  1| null|  null| 
|  1234|  2| 1|   1| 
|  5678|  1| 11|   11| 
|  5678|  2| 22|   11| 
+----------+-------+-----+-----------+ 

Antwort

1

Sie hier fehlt sein müssen, die rangeBetween Option definieren, für die es

lazy val window: WindowSpec = Window.partitionBy("service_id").orderBy("counter").rangeBetween(Long.MinValue, Long.MaxValue) 

Sein zu arbeiten, weil, wenn Sie don‘ t Bereich definieren in window Funktion dann inkrementellen Bereich genommen wird, dh für die erste Zeile, Bereich ist 1 Zeile, für die zweite Zeile, der Bereich ist 2 Zeilen und so weiter ..... alle innerhalb des partitionierten Fensters.

Ich hoffe, die Antwort ist hilfreich

+0

Dank thats funktioniert. Obwohl diese scheinen sollten, sollte der Standardwert sein. – xstack2000

+0

mein Vergnügen @ xstack2000, :) und danke für die Verbesserung und Akzeptanz –

Verwandte Themen