Зачем мне .union вместо .unionAll в Spark для SchemaRDD?

Я пытаюсь обойти эти две функции в Документация по Spark SQL -

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

    Верните объединение этого RDD и другого.

  • def unionAll (otherPlan: SchemaRDD): SchemaRDD

    Объединяет кортежи двух RDD с одной и той же схемой, сохраняя дубликаты.

Это не стандартное поведение UNION vs UNION ALL, , как описано в этом ТАК вопросе.

Мой код здесь заимствован из документации Spark SQL, две функции возвращают одинаковые результаты.

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

Почему я предпочитаю одно другому?


person duber    schedule 12.03.2015    source источник


Ответы (3)


В Spark 1.6 указанная выше версия union была удалена, поэтому осталось unionAll.

В Spark 2.0 unionAll был переименован в union с сохранением unionAll для обратной совместимости (я полагаю).

В любом случае дедупликация не выполняется ни в _ 6_ (Spark 2.0) или _ 7_ (Spark 1.6).

person Kris    schedule 07.11.2016
comment
Идеальный ответ действительно понял, что его правильный unionAll устарел, и есть объединение, которое добавляет с дубликатами. - person Doogle; 21.01.2019

unionAll() устарел в Spark 2.0 и на все будущее ссылка, union() - единственный рекомендуемый метод.

В любом случае, union или unionAll, оба не выполняют дедупликацию данных в стиле SQL. Чтобы удалить любые повторяющиеся строки, просто используйте union(), за которым следует distinct().

person Keshav Potluri    schedule 02.10.2017

Судя по сигнатуре типа и (сомнительной) семантике, я считаю, что union() был рудиментарным.

Более современный DataFrame API предлагает только unionAll().

person Joe Halliwell    schedule 29.09.2015