为什么我要在 Spark 中为 SchemaRDD 使用 .union 而不是 .unionAll?

Why would I want .union over .unionAll in Spark for SchemaRDDs?

我正在努力思考 Spark SQL documentation

中的这两个函数

这不是 UNION 与 UNION ALL 的标准行为,as documented in this SO question

我这里的代码是从 Spark SQL documentation 借用的,两个函数返回相同的结果。

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

为什么我更喜欢其中之一?

从它的类型签名和(有问题的)语义来看,我认为 union() 已经过时了。

更现代的 DataFrame API 仅提供 unionAll()

在 Spark 1.6 中,上面版本的 union 被移除,所以只剩下 unionAll

在 Spark 2.0 中,unionAll 被重命名为 union,保留 unionAll 是为了向后兼容(我猜)。

在任何情况下,union (Spark 2.0) or unionAll (Spark 1.6).

中都没有重复数据删除

unionAll()Spark 2.0 中被弃用,对于所有未来的参考,union() 是唯一推荐的方法。

在任何一种情况下,unionunionAll,都不会执行 SQL 样式的数据重复数据删除。为了删除任何重复的行,只需使用 union() 后跟 distinct().