J'essaie de faire le tour de ces deux fonctions dans la documentation Spark SQL -
def union (autre: RDD [Row]): RDD [Row]
Renvoyez l'union de ce RDD et d'un autre.
def unionAll (otherPlan: SchemaRDD): SchemaRDD
Combine les tuples de deux RDD avec le même schéma, en conservant les doublons.
Ce n'est pas le comportement standard d'UNION vs UNION ALL, comme documenté dans cette SO question .
Mon code ici, emprunté à la documentation Spark SQL , a les deux fonctions retournant les mêmes résultats.
scala> case class Person(name: String, age: Int)
scala> import org.Apache.spark.sql._
scala> val one = sc.parallelize(Array(Person("Alpha",1), Person("Beta",2)))
scala> val two = sc.parallelize(Array(Person("Alpha",1), Person("Beta",2), Person("Gamma", 3)))
scala> val schemaString = "name age"
scala> val schema = StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))
scala> val peopleSchemaRDD1 = sqlContext.applySchema(one, schema)
scala> val peopleSchemaRDD2 = sqlContext.applySchema(two, schema)
scala> peopleSchemaRDD1.union(peopleSchemaRDD2).collect
res34: Array[org.Apache.spark.sql.Row] = Array([Alpha,1], [Beta,2], [Alpha,1], [Beta,2], [Gamma,3])
scala> peopleSchemaRDD1.unionAll(peopleSchemaRDD2).collect
res35: Array[org.Apache.spark.sql.Row] = Array([Alpha,1], [Beta,2], [Alpha,1], [Beta,2], [Gamma,3])
Pourquoi devrais-je préférer l'un à l'autre?
Dans Spark 1.6, la version ci-dessus de union
a été supprimée, donc unionAll
était tout ce qui restait.
Dans Spark 2.0, unionAll
a été renommé union
, avec unionAll
conservé pour des raisons de compatibilité descendante (je suppose).
Dans tous les cas, aucune déduplication n'est effectuée dans union
(Spark 2.0) ou unionAll
(Spark 1.6) .
unionAll()
a été déconseillé dans Spark 2. , et pour toute référence future, union()
est la seule méthode recommandée.
Dans les deux cas, union
ou unionAll
, les deux n'effectuent pas de déduplication de style SQL des données. Afin de supprimer les lignes en double, utilisez simplement union()
suivi de distinct()
.
À en juger par sa signature typographique et sa sémantique (discutable), je crois que union()
était un vestige.
Le plus moderne DataFrame API n'offre que unionAll()
.