Я пытаюсь осмыслить эти две функции в Документация по 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])

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

16
duber 13 Мар 2015 в 02:56

3 ответа

Лучший ответ

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

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

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

39
Kris 7 Ноя 2016 в 15:45

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

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

1
Joe Halliwell 29 Сен 2015 в 13:15

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

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

10
Keshav Potluri 2 Окт 2017 в 22:30