Spark SQLのドキュメント –で、これら2つの関数に頭を抱えようとしています
def union(other:RDD [Row]):RDD [Row]
このRDDと別のRDDの結合を返します。
def unionAll(otherPlan:SchemaRDD):SchemaRDD
2つのRDDのタプルを同じスキーマと組み合わせて、重複を維持します。
これはUNIONとUNION ALLの標準的な動作ではありません このSO質問 に記載されています)。
Spark SQLのドキュメント から借用した私のコードには、同じ結果を返す2つの関数があります。
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])
なぜ私は他の方を好むのですか?
Spark 1.6では、上記のバージョンのunion
が削除されたため、unionAll
だけが残りました。
Spark 2.0では、unionAll
はunion
に名前が変更され、unionAll
は下位互換性のために保持されています(おそらく)。
いずれの場合も、重複排除は union
(Spark 2.0) または unionAll
(Spark 1.6) のどちらでも行われません。
unionAll()
は Spark 2. で廃止されました。今後のすべての参照では、union()
が唯一の推奨されるメソッドです。
どちらの場合でも、union
またはunionAll
はどちらも、SQLスタイルのデータ重複排除を行いません。重複する行を削除するには、union()
に続けてdistinct()
を使用します。
その型シグネチャと(疑わしい)セマンティクスから判断すると、union()
は痕跡的だったと思います。
より新しい DataFrame API はunionAll()
のみを提供します。