Spark SQL中不同类型的JOIN

788 阅读3分钟

目录

阅读时间: 3 分钟

Spark SQL中的Join是连接两个或多个数据集的功能,类似于基于SQL的数据库中的表连接。Spark的工作方式是数据集和数据框架的表格形式。Spark SQL支持几种类型的连接,如内连接、交叉连接、左外连接、右外连接、全外连接、左半连接、左反连接。在Spark SQL中根据业务使用情况来实现连接方案。有些连接需要高资源和计算效率。为了管理这样的场景,Spark支持SQL优化器和交叉连接功能的标志。

Spark SQL中的连接类型

以下是不同类型的连接。

  • 内联(INNER JOIN
  • 左外连接
  • 右外联接
  • 全外连接
  • 左半联接
  • 左侧反接

创建数据的例子

我们将使用下面的数据来演示不同类型的连接。

书籍数据集。

case class Book(book_name: String, cost: Int, writer_id:Int)
val bookDS = Seq(
Book("Scala", 400, 1),
Book("Spark", 500, 2),
Book("Kafka", 300, 3),
Book("Java", 350, 5)
).toDS()
bookDS.show()

Book Dataset Joins in Spark SQLBook Dataset Joins in Spark SQL

作者数据集。

case class Writer(writer_name: String, writer_id:Int)
val writerDS = Seq(
Writer("Martin",1),
Writer("Zaharia " 2),
Writer("Neha", 3),
Writer("James", 4)
).toDS()
writerDS.show()

Writer Dataset joins in spark SQLWriter Dataset joins in spark SQL

连接的类型

下面提到了7种不同类型的连接。

1.内联(INNER JOIN

INNER JOIN返回的数据集有两个数据集中具有匹配值的记录,即共同字段的值将是相同的。

val BookWriterInner = bookDS.join(writerDS, bookDS("writer_id") === writerDS("writer_id"), "inner")
BookWriterInner.show()

INNER JOIN Joins in Spark SQLINNER JOIN Joins in Spark SQL

2.左外连接

LEFT OUTER JOIN返回的数据集有来自左边数据集的所有记录,以及来自右边数据集的匹配记录。

val BookWriterLeft = bookDS.join(writerDS, bookDS("writer_id") === writerDS("writer_id"), "leftouter")
BookWriterLeft.show()

LEFT OUTER JOIN Joins in Spark SQLLEFT OUTER JOIN Joins in Spark SQL

3.右外联接

RIGHT OUTER JOIN返回数据集,该数据集有来自右边数据集的所有记录,以及来自左边数据集的匹配记录。

val BookWriterRight = bookDS.join(writerDS, bookDS("writer_id") === writerDS("writer_id"), "rightouter")
BookWriterRight.show()

RIGHT OUTER JOIN Joins in Spark SQLRIGHT OUTER JOIN Joins in Spark SQL

4.全外联接

当左数据集或右数据集有匹配的记录时,FULL OUTER JOIN返回拥有所有记录的数据集。

val BookWriterFull = bookDS.join(writerDS, bookDS("writer_id") === writerDS("writer_id"), "fullouter")
BookWriterFull.show()

FULL OUTER JOINFULL OUTER JOIN

5.LEFT SEMI JOIN

LEFT SEMI JOIN返回的数据集在左边数据集的所有记录在右边数据集都有对应的记录。与LEFT OUTER JOIN不同,LEFT SEMI JOIN返回的数据集只包含左边数据集的列。

val BookWriterLeftSemi = bookDS.join(writerDS, bookDS("writer_id") === writerDS("writer_id"), "leftsemi")
BookWriterLeftSemi.show()

LEFT SEMI JOINLEFT SEMI JOIN

6.LEFT ANTI JOIN

ANTI SEMI JOIN返回的数据集包含了左边数据集中所有在右边数据集中不匹配的行。它也只包含左边数据集的列。

val BookWriterLeftAnti = bookDS.join(writerDS, bookDS("writer_id") === writerDS("writer_id"), "leftanti")
BookWriterLeftAnti.show()

LEFT ANTI JOINLEFT ANTI JOIN

结论

连接数据是完成我们业务使用案例的最常见和最重要的操作之一。Spark SQL支持所有基本类型的连接。在连接时,我们还需要考虑性能,因为它们可能需要大量的网络传输,甚至创建超出我们处理能力的数据集。