2015-03-12 1 views
5

Я пытаюсь обернуть мою голову вокруг этих двух функций в Spark SQL documentation -Зачем мне нужен .union over .unionВсе в Spark для SchemaRDD?

  • Защиту союз (другой: РДД [Row]): РДД [Row]

    Возвращение союза это RDD и еще один.

  • Защиту unionAll (otherPlan: SchemaRDD): SchemaRDD

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

Это не стандартное поведение 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]) 

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

ответ

5

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

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

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

1

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^