我想通过应用广播变量加入两套。我正在尝试实施Spark: what's the best strategy for joining a 2-tuple-key RDD with single-key RDD?
中的第一个建议private IRequestHandler GetServiceByInstanceId(Guid instanceId)
{
Tuple<CollectionInfo,ServiceInfo> pair;
if (_collectionsServicesMapping.TryGetValue(instanceId, out pair))
{
return pair.Item2;
}
// whatever you want to return if instanceId wasn't found
return null;
}
但是如前所述:broadcast variable fails to take all data我需要使用collect()而不是collectAsMAp()。我试着调整我的代码如下:
val emp_newBC = sc.broadcast(emp_new.collectAsMap())
val joined = emp.mapPartitions({ iter =>
val m = emp_newBC.value
for {
((t, w)) <- iter
if m.contains(t)
} yield ((w + '-' + m.get(t).get),1)
}, preservesPartitioning = true)
但似乎m.contains(t)没有回应。我该如何解决这个问题?
提前致谢。
答案 0 :(得分:2)
这样的事情怎么样?
val emp_newBC = sc.broadcast(emp_new.groupByKey.collectAsMap)
val joined = emp.mapPartitions(iter => for {
(k, v1) <- iter
v2 <- emp_newBC.value.getOrElse(k, Iterable())
} yield (s"$v1-$v2", 1))
关于您的代码...据我所知,emp_new
是RDD[(String, String)]
。收集后,您会收到Array[(String, String)]
。当你使用
((t, w)) <- iter
t
是String
,因此m.contains(t)
将始终返回false
。
我看到的另一个问题是preservesPartitioning = true
内的mapPartitions
。有几种可能的情况:
emp
已分区,您也希望对joined
进行分区。由于您将密钥从t
更改为某个新值,因此无法保留分区,因此必须重新分区RDD
。如果您使用preservesPartitioning = true
输出RDD
将导致错误的分区。emp
已分区,但您不需要为joined
进行分区。没有理由使用preservesPartitioning
。emp
未分区。设置preservesPartitioning
无效。