先定义参与Join的DataFrames:
val EmployeeDF = Seq[(String, Integer)](
("Rafferty", 31),
("Timothy", 32),
("Jones", 33),
("Heisenberg", 33),
("Robinson", 34),
("Smith", 34),
("Williams", null)
).toDF("LastName", "DepartmentID")
val ExDF = Seq[(Integer, String)](
(31, "Sales"),
(33, "Engineering"),
(34, "Clerical"),
(35, "Marketing"),
(null, "CEO")
).toDF("ExID", "DepartmentName")
这里给出两个DataFrames做Inner Join的简单例子
scala> EmployeeDF.join(ExDF, col("DepartmentID")===col("ExID")).show
+----------+------------+----+--------------+
| LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
| Rafferty| 31| 31| Sales|
| Jones| 33| 33| Engineering|
|Heisenberg| 33| 33| Engineering|
| Robinson| 34| 34| Clerical|
| Smith| 34| 34| Clerical|
+----------+------------+----+--------------+
scala> EmployeeDF.join(ExDF, $"DepartmentID"===$"ExID").show
+----------+------------+----+--------------+
| LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
| Rafferty| 31| 31| Sales|
| Jones| 33| 33| Engineering|
|Heisenberg| 33| 33| Engineering|
| Robinson| 34| 34| Clerical|
| Smith| 34| 34| Clerical|
+----------+------------+----+--------------+
scala> EmployeeDF.join(ExDF, 'DepartmentID==='ExID).show
+----------+------------+----+--------------+
| LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
| Rafferty| 31| 31| Sales|
| Jones| 33| 33| Engineering|
|Heisenberg| 33| 33| Engineering|
| Robinson| 34| 34| Clerical|
| Smith| 34| 34| Clerical|
+----------+------------+----+--------------+
scala> EmployeeDF.join(ExDF, EmployeeDF("DepartmentID")===ExDF("ExID")).show
+----------+------------+----+--------------+
| LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
| Rafferty| 31| 31| Sales|
| Jones| 33| 33| Engineering|
|Heisenberg| 33| 33| Engineering|
| Robinson| 34| 34| Clerical|
| Smith| 34| 34| Clerical|
+----------+------------+----+--------------+
表示关系的参数joinExprs的类型是Column,而这里需要表达式的结果是值为true或false的Column类型,这必然会使用已有DataFrames中的列。由上面的例子可以看到有四种表示DataFrame中列的方法:
- 使用列函数col(),将列名字的字符串作为该函数的参数。
- 简单地使用$和字符串,就表示了名字为这个字符串的列。显然,这要求关系式中两边列的名字必须不同,否则就无法区分它们。
- 在可以明确区分关系列名字的边界的时候,即后面接着非字母数字时,可以用更简单的表示方法:单引号 ' 加列名字。
- 第二个例子则是用DataFrame的名字括上了列名的字符串,就非常明确地表示了这个DataFrame的列。即使两列的名字相同也能区分它们。
可以看到,实际上前三种方法是等价的。