2015-03-12 16 views
5

Sto cercando di avvolgere la mia testa intorno a queste due funzioni in Spark SQL documentation -Perché dovrei .union su .unionAll in Spark for SchemaRDDs?

  • def unione (altro: RDD [Row]): RDD [Row]

    ritorno l'unione di questo RDD e un altro.

  • def unionAll (otherPlan: SchemaRDD): SchemaRDD

    combina le tuple di due RDDs con lo stesso schema, mantenendo i duplicati.

questo non è il comportamento standard di UNION vs UNION ALL, as documented in this SO question.

Il mio codice qui, prendendo in prestito dallo Spark SQL documentation, ha le due funzioni che restituiscono gli stessi risultati.

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

Perché preferire uno rispetto all'altro?

risposta

5

In Spark 1.6, la versione precedente di union è stata rimossa, quindi unionAll era tutto ciò che rimaneva.

In Spark 2.0, unionAll è stato rinominato in union, con unionAll conservato per compatibilità con le versioni precedenti (credo).

In ogni caso, nessuna deduplicazione viene eseguita in union (Spark 2.0) o unionAll (Spark 1.6).

1

A giudicare dal suo tipo di firma e semantica (discutibile) credo che lo union() sia stato rudimentale.

Il più moderno DataFrame API offre solo unionAll().

1

unionAll() è stato dichiarato obsoleto in Spark 2.0 e per tutti i riferimenti futuri, union() è l'unico metodo consigliato.

In entrambi i casi, union o unionAll, entrambi non eseguono una deduplicazione di dati in stile SQL. Per rimuovere eventuali righe duplicate, utilizzare semplicemente union() seguito da distinct().