복붙노트

[SCALA] 스파크 DataFrame에서 === null이 isNull에 차이

SCALA

스파크 DataFrame에서 === null이 isNull에 차이

우리가 사용하고있을 때 나는 조금의 차이로 혼란 스러워요

 df.filter(col("c1") === null) and df.filter(col("c1").isNull) 

같은 dataframe 전에서 카운트를 얻고있다 === null이 있지만, isNull에 제로 카운트. 나 차이를 이해하는 데 도움이 바랍니다. 감사

해결법

  1. ==============================

    1.당신이 정말로 호환성 이유에하지 않는 한 맨 먼저 당신의 스칼라 코드에 널 (null)를 사용하지 마십시오.

    당신이 정말로 호환성 이유에하지 않는 한 맨 먼저 당신의 스칼라 코드에 널 (null)를 사용하지 마십시오.

    귀하의 질문에 관해서는 일반 SQL이다. COL ( "C1")가 널 === NULL 마크 값들을 미정 때문에, 결과는 NULL 자체를 포함하는 임의의 값으로 정의되어 C1 = NULL로 해석된다.

    spark.sql("SELECT NULL = NULL").show
    
    +-------------+
    |(NULL = NULL)|
    +-------------+
    |         null|
    +-------------+
    
    spark.sql("SELECT NULL != NULL").show
    
    +-------------------+
    |(NOT (NULL = NULL))|
    +-------------------+
    |               null|
    +-------------------+
    
    spark.sql("SELECT TRUE != NULL").show
    
    +------------------------------------+
    |(NOT (true = CAST(NULL AS BOOLEAN)))|
    +------------------------------------+
    |                                null|
    +------------------------------------+
    
    spark.sql("SELECT TRUE = NULL").show
    
    +------------------------------+
    |(true = CAST(NULL AS BOOLEAN))|
    +------------------------------+
    |                          null|
    +------------------------------+
    

    NULL에 대한 검사의 유일한 유효한 방법은 다음과 같습니다

    각각 Column.isNull 및 Column.isNotNull 등 DataFrame DSL 구현.

    노트 :

    NULL 안전 비교 사용이 별개를 들어 / DISTINCT되지 않습니다 :

    spark.sql("SELECT NULL IS NOT DISTINCT FROM NULL").show
    
    +---------------+
    |(NULL <=> NULL)|
    +---------------+
    |           true|
    +---------------+
    
    spark.sql("SELECT NULL IS NOT DISTINCT FROM TRUE").show
    
    +--------------------------------+
    |(CAST(NULL AS BOOLEAN) <=> true)|
    +--------------------------------+
    |                           false|
    +--------------------------------+
    

    여부 (_ <=> _) / <=>

    spark.sql("SELECT NULL AS col1, NULL AS col2").select($"col1" <=> $"col2").show
    
    +---------------+
    |(col1 <=> col2)|
    +---------------+
    |           true|
    +---------------+
    
    spark.sql("SELECT NULL AS col1, TRUE AS col2").select($"col1" <=> $"col2").show
    
    +---------------+
    |(col1 <=> col2)|
    +---------------+
    |          false|
    +---------------+
    

    각각 SQL 및 DataFrame DSL한다.

    관련 :

    아파치 스파크에 널 (null) 값을 포함하면 가입

  2. ==============================

    2.일반적으로 가장 좋은 방법은 Dataframes는 설명 할 계획을 살펴 보는 것입니다 스파크에서 예상치 못한 결과에 빛을 흘릴 수 있습니다. 다음 예를 살펴 보겠습니다 :

    일반적으로 가장 좋은 방법은 Dataframes는 설명 할 계획을 살펴 보는 것입니다 스파크에서 예상치 못한 결과에 빛을 흘릴 수 있습니다. 다음 예를 살펴 보겠습니다 :

    import org.apache.spark.sql.{DataFrame, SparkSession}
    import org.apache.spark.sql.functions._
    
    object Example extends App {
    
      val session = SparkSession.builder().master("local[*]").getOrCreate()
      case class Record(c1: String, c2: String)
      val data = List(Record("a", "b"), Record(null, "c"))
      val rdd = session.sparkContext.parallelize(data)
      import session.implicits._
    
      val df: DataFrame = rdd.toDF
      val filtered = df.filter(col("c1") === null)
      println(filtered.count()) // <-- outputs 0, not expected
    
      val filtered2 = df.filter(col("c1").isNull)
      println(filtered2.count())
      println(filtered2) // <- outputs 1, as expected
    
      filtered.explain(true)
      filtered2.explain(true)
    }
    

    은 첫 번째 계획 쇼를 설명 :

    == Physical Plan ==
    *Filter (isnotnull(c1#2) && null)
    +- Scan ExistingRDD[c1#2,c2#3]
    == Parsed Logical Plan ==
    'Filter isnull('c1)
    +- LogicalRDD [c1#2, c2#3]
    

    이 필터 절은 무의미한 보인다. null로 &&이 true로 해결할 수 없다 보장합니다.

    에 두 번째로 계획 외모와 같은 설명 :

    == Physical Plan ==
    *Filter isnull(c1#2)
    +- Scan ExistingRDD[c1#2,c2#3]
    

    여기에 필터가 기대하고 원하는 것입니다.

  3. from https://stackoverflow.com/questions/41533290/difference-between-null-and-isnull-in-spark-datadrame by cc-by-sa and MIT license