Maison >base de données >tutoriel mysql >Comment puis-je conserver les valeurs nulles lors des jointures Apache Spark ?

Comment puis-je conserver les valeurs nulles lors des jointures Apache Spark ?

DDD
DDDoriginal
2024-12-31 17:36:11207parcourir

How Can I Preserve Null Values During Apache Spark Joins?

Conservation des valeurs nulles dans les jointures Apache Spark

Par défaut, Apache Spark omet les lignes avec des valeurs nulles lors de l'exécution de jointures. Pour inclure ces valeurs dans la sortie de jointure, Spark propose plusieurs options.

NULL-Safe Equality Operator (<=>)

Spark 1.6 a introduit un NULL spécial -opérateur d'égalité sûr qui vous permet d'inclure des valeurs nulles dans votre jointure critères.

numbersDf
  .join(lettersDf, numbersDf("numbers") <=> lettersDf("numbers"))
  .drop(lettersDf("numbers"))

Column.eqNullSafe (PySpark 2.3.0)

Dans PySpark 2.3.0 et versions ultérieures, vous pouvez utiliser Column.eqNullSafe pour effectuer NULL- égalité sûre contrôles.

numbers_df = sc.parallelize([
    ("123", ), ("456", ), (None, ), ("", )
]).toDF(["numbers"])

letters_df = sc.parallelize([
    ("123", "abc"), ("456", "def"), (None, "zzz"), ("", "hhh")
]).toDF(["numbers", "letters"])

numbers_df.join(letters_df, numbers_df.numbers.eqNullSafe(letters_df.numbers))

%<=>% (SparkR)

SparkR propose un opérateur %<=>% pour les contrôles d'égalité sécurisés par NULL .

numbers_df <- createDataFrame(data.frame(numbers = c("123", "456", NA, "")))
letters_df <- createDataFrame(data.frame(
  numbers = c("123", "456", NA, ""),
  letters = c("abc", "def", "zzz", "hhh")
))

head(join(numbers_df, letters_df, numbers_df$numbers %<=>% letters_df$numbers))

N'EST PAS DISTINCTE DE (SQL)

Dans SQL (Spark 2.2.0), vous pouvez utiliser IS NOT DISTINCT FROM pour conserver les valeurs nulles dans les jointures.

SELECT * FROM numbers JOIN letters 
ON numbers.numbers IS NOT DISTINCT FROM letters.numbers

Cet opérateur peut également être utilisé avec l'API DataFrame :

numbersDf.alias("numbers")
  .join(lettersDf.alias("letters"))
  .where("numbers.numbers IS NOT DISTINCT FROM letters.numbers")

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn