2015-03-12 8 views
5

Próbuję owinąć głowę wokół tych dwóch funkcji w Spark SQL documentation -Dlaczego chciałbym .union ponad .unionAll w Spark dla SchemaRDDs?

  • def Union (inny: RDD [Wiersz]): RDD [Wiersz]

    Return unii ten RDD i inny.

  • def unionAll (otherPlan: SchemaRDD) SchemaRDD

    Łączy krotki dwóch ZOPS z tym samym schematem, utrzymując duplikatów.

To nie jest standardowe zachowanie UNION vs UNION ALL, as documented in this SO question.

Mój kod tutaj, pożyczając od Spark SQL documentation, ma dwie funkcje zwracające takie same wyniki.

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

Dlaczego miałbym preferować jeden nad drugim?

Odpowiedz

5

W Spark 1.6 powyższa wersja union została usunięta, więc tylko jedna pozostałaby unionAll.

W Spark 2.0, unionAll został przemianowany na union, z unionAll zachowane w celu zapewnienia kompatybilności wstecznej (chyba).

W żadnym wypadku nie jest przeprowadzana deduplikacja w union (Spark 2.0) lub unionAll (Spark 1.6).

1

Sądząc z jego podpisu typu i (wątpliwej) semantyki, uważam, że union() był szczątkowy.

Bardziej nowoczesny DataFrame API oferuje tylko unionAll().

1

unionAll() był przestarzały w Spark 2.0, a dla wszystkich przyszłych referencji, jedyną zalecaną metodą jest union().

W obu przypadkach: union lub unionAll, oba nie wykonują deduplikacji danych w stylu SQL. Aby usunąć dowolne zduplikowane wiersze, użyj po prostu union(), a następnie distinct().

Powiązane problemy