web-dev-qa-db-ja.com

Spark for SchemaRDDs)で.unionAllよりも.unionが必要なのはなぜですか?

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

なぜ私は他の方を好むのですか?

13
duber

Spark 1.6では、上記のバージョンのunionが削除されたため、unionAllだけが残りました。

Spark 2.0では、unionAllunionに名前が変更され、unionAllは下位互換性のために保持されています(おそらく)。

いずれの場合も、重複排除は union(Spark 2.0) または unionAll(Spark 1.6) のどちらでも行われません。

33
Kris

unionAll()Spark 2. で廃止されました。今後のすべての参照では、union()が唯一の推奨されるメソッドです。

どちらの場合でも、unionまたはunionAllはどちらも、SQLスタイルのデータ重複排除を行いません。重複する行を削除するには、union()に続けてdistinct()を使用します。

7
Keshav Potluri

その型シグネチャと(疑わしい)セマンティクスから判断すると、union()は痕跡的だったと思います。

より新しい DataFrame APIunionAll()のみを提供します。

1
Joe Halliwell