连接操作仅定义在PairwiseRDDs
这与 SQL 中的关系/表有很大不同。的每个元素PairwiseRDD
is a Tuple2
其中第一个元素是key
第二个是value
。两者都可以包含复杂的对象,只要key
提供了有意义的hashCode
如果你想用 SQL 语言来思考这个问题,你可以将 key 视为所有的内容ON
条款和value
包含选定的列。
SELECT table1.value, table2.value
FROM table1 JOIN table2 ON table1.key = table2.key
虽然这些方法乍一看很相似,并且您可以使用另一种方法来表达,但它们之间存在根本区别。当您查看 SQL 表并忽略约束时,所有列都属于同一类对象,而key
and value
in the PairwiseRDD
有明确的含义。
回到你的问题来使用join
你两者都需要key
and value
。可以说比使用干净得多0
作为占位符将使用null
单例,但确实没有办法解决它。
对于小数据,您可以以类似于广播连接的方式使用过滤器:
val moviesidBD = sc.broadcast(
lines.map(x => x.split("\t")).map(_.head).collect.toSet)
movienames.filter{case (id, _) => moviesidBD.value contains id}
但如果你真的想要 SQL 式的连接,那么你应该简单地使用 SparkSQL。
val movieIdsDf = lines
.map(x => x.split("\t"))
.map(a => Tuple1(a.head))
.toDF("id")
val movienamesDf = movienames.toDF("id", "name")
// Add optional join type qualifier
movienamesDf.join(movieIdsDf, movieIdsDf("id") <=> movienamesDf("id"))