为什么我要在 Spark 中为 SchemaRDD 使用 .union 而不是 .unionAll?
Why would I want .union over .unionAll in Spark for SchemaRDDs?
我正在努力思考 Spark SQL documentation–
中的这两个函数
def union(other: RDD[Row]): RDD[Row]
Return这个RDD和另一个RDD的并集
def unionAll(otherPlan: SchemaRDD): SchemaRDD
将两个具有相同模式的 RDD 的元组合并,保留重复项。
这不是 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()
是唯一推荐的方法。
在任何一种情况下,union
或 unionAll
,都不会执行 SQL 样式的数据重复数据删除。为了删除任何重复的行,只需使用 union()
后跟 distinct()
.
我正在努力思考 Spark SQL documentation–
中的这两个函数def union(other: RDD[Row]): RDD[Row]
Return这个RDD和另一个RDD的并集
def unionAll(otherPlan: SchemaRDD): SchemaRDD
将两个具有相同模式的 RDD 的元组合并,保留重复项。
这不是 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()
是唯一推荐的方法。
在任何一种情况下,union
或 unionAll
,都不会执行 SQL 样式的数据重复数据删除。为了删除任何重复的行,只需使用 union()
后跟 distinct()
.