2017-10-28 2 views
0

Spark 문서의 첫 번째 함수를 읽는 중 ignoreNulls가 첫 번째 null이 아닌 값을 가져올 것이라고 언급했습니다.DataFrame 첫 번째 함수 ignoreNulls가 작동하지 않습니다.

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

그러면 다음과 같은 결과가 반환됩니다. 나는 FIRST_VALUE의 첫 번째 행에 null 값이 내가 여기서 뭔가

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

답변

1

에게 실종 1. 오전되고 싶어요 당신은 당신이 '돈 있으면 있기 때문에

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

그 일을하기 위해 rangeBetween 옵션을 정의해야 t 범위를 window 함수로 정의하면 증가하는 범위가 취해집니다. 즉, 첫 번째 행의 경우 범위는 1 행이고 두 번째 행의 경우 범위는 2 행 등입니다.

답변이 도움이 되었기를 바랍니다.

+0

감사합니다. 그것들은 디폴트 값 이었음에 틀림 없다. – xstack2000

+0

내 기쁨 @ xstack2000, :) 그리고 upvote 및 수용에 대한 감사합니다 –

관련 문제