web-dev-qa-db-fra.com

Pourquoi voudrais-je .union sur .unionAll dans Spark pour SchemaRDDs?

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?

13
duber

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) .

33
Kris

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().

7
Keshav Potluri

À 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().

1
Joe Halliwell