[SCALA] 스파크 DataFrame에서 === null이 isNull에 차이
SCALA스파크 DataFrame에서 === null이 isNull에 차이
우리가 사용하고있을 때 나는 조금의 차이로 혼란 스러워요
df.filter(col("c1") === null) and df.filter(col("c1").isNull)
같은 dataframe 전에서 카운트를 얻고있다 === null이 있지만, isNull에 제로 카운트. 나 차이를 이해하는 데 도움이 바랍니다. 감사
해결법
-
==============================
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.일반적으로 가장 좋은 방법은 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]
여기에 필터가 기대하고 원하는 것입니다.
from https://stackoverflow.com/questions/41533290/difference-between-null-and-isnull-in-spark-datadrame by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 가져 오기 TypeTag [A] 클래스에서 [A] (0) | 2019.11.13 |
---|---|
[SCALA] 어떻게하면 saveAsTextFile RDD [(문자열, INT)]에 기록 괄호를 제거하려면? (0) | 2019.11.13 |
[SCALA] 어떻게 억제 정보와 SBT의 성공 메시지? (0) | 2019.11.13 |
[SCALA] 스칼라 함수 객체의 가변 인자와 오류? (0) | 2019.11.13 |
[SCALA] w /를 unboundid LDAP의 SDK 스칼라에서 암호 변경하려고 할 때 어떻게 "WILL_NOT_PERFORM"MS의 AD 응답을 해결하는 방법은 무엇입니까? (0) | 2019.11.13 |