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
Libérer: 2024-12-31 17:36:11
original
254 Les gens l'ont consulté

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"))
Copier après la connexion

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))
Copier après la connexion

%<=>% (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))
Copier après la connexion

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
Copier après la connexion

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")
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal