擅长:python、mysql、java
<p>在这种情况下,您希望实现的是在每个分区上使用department表中包含的数据进行筛选:
这将是基本的解决方案:</p>
<pre><code>val dept = deptRdd.collect.toSet
val employeesWithValidDeptRdd = employeesRdd.filter{case (employee, d) => dept.contains(d)}
</code></pre>
<p>如果您的部门数据很大,广播变量将通过将数据一次传递到所有节点来提高性能,而不必将其与每个任务序列化</p>
<pre><code>val deptBC = sc.broadcast(deptRdd.collect.toSet)
val employeesWithValidDeptRdd = employeesRdd.filter{case (employee, d) => deptBC.value.contains(d)}
</code></pre>
<p>尽管使用join可以工作,但这是一个非常昂贵的解决方案,因为它需要分布式数据洗牌(byKey)来实现join。考虑到需求是一个简单的过滤器,将数据发送到每个分区(如上所示)将提供更好的性能。</p>