Я пытаюсь осмыслить эти две функции в Документация по 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])
Почему я предпочитаю одно другому?
3 ответа
В Spark 1.6 указанная выше версия union
была удалена, так что unionAll
- все, что осталось.
В Spark 2.0 unionAll
был переименован в union
с сохранением unionAll
для обратной совместимости (я полагаю).
В любом случае дедупликация не выполняется ни в union
(Spark 2.0) или unionAll
(Spark 1.6).
Судя по сигнатуре типа и (сомнительной) семантике, я считаю, что union()
был рудиментарным.
Более современный DataFrame API предлагает только unionAll()
.
unionAll()
устарел в Spark 2.0, и на будущее, union()
- единственный рекомендуемый метод.
В любом случае, union
или unionAll
, оба не выполняют дедупликацию данных в стиле SQL. Чтобы удалить любые повторяющиеся строки, просто используйте union()
, за которым следует distinct()
.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.