我正在尝试把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)中都不会进行重复数据删除。