scala apache-spark apache-spark-sql spark-dataframe apache-spark-2.0

scala - ¿Cuáles son los distintos tipos de unión en Spark?



apache-spark apache-spark-sql (3)

Aquí hay un experimento ilustrativo simple:

import org.apache.spark._ import org.apache.spark.sql._ import org.apache.spark.sql.expressions._ import org.apache.spark.sql.functions._ object SparkSandbox extends App { case class Row(id: Int, value: String) private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate() import spark.implicits._ spark.sparkContext.setLogLevel("ERROR") val r1 = Seq(Row(1, "A1"), Row(2, "A2"), Row(3, "A3"), Row(4, "A4")).toDS() val r2 = Seq(Row(3, "A3"), Row(4, "A4"), Row(4, "A4_1"), Row(5, "A5"), Row(6, "A6")).toDS() val joinTypes = Seq("inner", "outer", "full", "full_outer", "left", "left_outer", "right", "right_outer", "left_semi", "left_anti") joinTypes foreach {joinType => println(s"${joinType.toUpperCase()} JOIN") r1.join(right = r2, usingColumns = Seq("id"), joinType = joinType).orderBy("id").show() } }

Salida

INNER JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 3| A3| A3| | 4| A4| A4_1| | 4| A4| A4| +---+-----+-----+ OUTER JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 1| A1| null| | 2| A2| null| | 3| A3| A3| | 4| A4| A4| | 4| A4| A4_1| | 5| null| A5| | 6| null| A6| +---+-----+-----+ FULL JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 1| A1| null| | 2| A2| null| | 3| A3| A3| | 4| A4| A4_1| | 4| A4| A4| | 5| null| A5| | 6| null| A6| +---+-----+-----+ FULL_OUTER JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 1| A1| null| | 2| A2| null| | 3| A3| A3| | 4| A4| A4_1| | 4| A4| A4| | 5| null| A5| | 6| null| A6| +---+-----+-----+ LEFT JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 1| A1| null| | 2| A2| null| | 3| A3| A3| | 4| A4| A4_1| | 4| A4| A4| +---+-----+-----+ LEFT_OUTER JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 1| A1| null| | 2| A2| null| | 3| A3| A3| | 4| A4| A4_1| | 4| A4| A4| +---+-----+-----+ RIGHT JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 3| A3| A3| | 4| A4| A4| | 4| A4| A4_1| | 5| null| A5| | 6| null| A6| +---+-----+-----+ RIGHT_OUTER JOIN +---+-----+-----+ | id|value|value| +---+-----+-----+ | 3| A3| A3| | 4| A4| A4_1| | 4| A4| A4| | 5| null| A5| | 6| null| A6| +---+-----+-----+ LEFT_SEMI JOIN +---+-----+ | id|value| +---+-----+ | 3| A3| | 4| A4| +---+-----+ LEFT_ANTI JOIN +---+-----+ | id|value| +---+-----+ | 1| A1| | 2| A2| +---+-----+

Miré los documentos y dice que los siguientes tipos de unión son compatibles:

Tipo de unión a realizar. Por defecto interno. Debe ser uno de los siguientes: interno, cruzado, externo, completo, completo, izquierdo, izquierdo, derecho, derecho, izquierdo, izquierdo, izquierdo.

Miré la respuesta de StackOverflow en las combinaciones de SQL y las dos primeras respuestas no mencionan algunas de las combinaciones de arriba, por ejemplo, left_semi e left_anti . ¿Qué significan en Spark?


Me encantó el ejemplo de Pathikrit. Aquí hay una posible traducción en Java usando Spark v2 y marcos de datos, incluida la unión cruzada.

package net.jgp.books.sparkInAction.ch12.lab940AllJoins; import java.util.ArrayList; import java.util.List; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.RowFactory; import org.apache.spark.sql.SparkSession; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; /** * All joins in a single app, inspired by * https://.com/questions/45990633/what-are-the-various-join-types-in-spark. * * Used in Spark in Action 2e, http://jgp.net/sia * * @author jgp */ public class AllJoinsApp { /** * main() is your entry point to the application. * * @param args */ public static void main(String[] args) { AllJoinsApp app = new AllJoinsApp(); app.start(); } /** * The processing code. */ private void start() { // Creates a session on a local master SparkSession spark = SparkSession.builder() .appName("Processing of invoices") .master("local") .getOrCreate(); StructType schema = DataTypes.createStructType(new StructField[] { DataTypes.createStructField( "id", DataTypes.IntegerType, false), DataTypes.createStructField( "value", DataTypes.StringType, false) }); List<Row> rows = new ArrayList<Row>(); rows.add(RowFactory.create(1, "A1")); rows.add(RowFactory.create(2, "A2")); rows.add(RowFactory.create(3, "A3")); rows.add(RowFactory.create(4, "A4")); Dataset<Row> dfLeft = spark.createDataFrame(rows, schema); dfLeft.show(); rows = new ArrayList<Row>(); rows.add(RowFactory.create(3, "A3")); rows.add(RowFactory.create(4, "A4")); rows.add(RowFactory.create(4, "A4_1")); rows.add(RowFactory.create(5, "A5")); rows.add(RowFactory.create(6, "A6")); Dataset<Row> dfRight = spark.createDataFrame(rows, schema); dfRight.show(); String[] joinTypes = new String[] { "inner", // v2.0.0. default "cross", // v2.2.0 "outer", // v2.0.0 "full", // v2.1.1 "full_outer", // v2.1.1 "left", // v2.1.1 "left_outer", // v2.0.0 "right", // v2.1.1 "right_outer", // v2.0.0 "left_semi", // v2.0.0, was leftsemi before v2.1.1 "left_anti" // v2.1.1 }; for (String joinType : joinTypes) { System.out.println(joinType.toUpperCase() + " JOIN"); Dataset<Row> df = dfLeft.join( dfRight, dfLeft.col("id").equalTo(dfRight.col("id")), joinType); df.orderBy(dfLeft.col("id")).show(); } } }

Pondré este ejemplo en Spark in Action, el repositorio del capítulo 12 de 2e .


Spark data frame support following types of joins between two dataframes. Please find the list of joins and joining string with respect to join types along with scala syntax. We can use following joining values used for specify the join type in Scala- Spark code. ***Mathod:*** Leftdataframe.join(Rightdataframe, join_conditions, joinStringName) Join Name : Join String name in scala -Spark code 1. inner : ''inner'' 2. cross: ''cross'' 3. outer: ''outer'' 4. full: ''full'' 5. full outer: ''fullouter'' 6. left : ''left'' 7. left outer : ''leftouter'' 8. right : ''right'' 9. right outer : ''rightouter'' 10. left semi: ''leftsemi'' 11. left anti: ''leftanti'' example: 1. Left Semi join: Leftdataframe.join(Rightdataframe, join_conditions, "leftsemi"); 2. inner Join Example: Leftdataframe.join(Rightdataframe, join_conditions, "inner"); Its tested and working well.