我正在尝试把Spark SQL documentation中的这两个函数缠在一起


def union(other:RDD [Row]):RDD [Row]

返回此RDD和另一个的联合。
def unionAll(otherPlan:SchemaRDD):SchemaRDD

将两个RDD的元组与相同的架构组合在一起,并保持重复。


这不是UNION vs 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])


为什么我偏爱一个?

最佳答案

在Spark 1.6中,删除了以上版本的union,因此仅剩下unionAll

在Spark 2.0中,unionAll重命名为union,并保留了unionAll以便向后兼容(我想)。

无论如何,在union (Spark 2.0)unionAll (Spark 1.6)中都不会进行重复数据删除。

07-24 09:50