在广播变量中查找值

时间:2015-09-21 17:32:38

标签: scala apache-spark broadcast

我想通过应用广播变量加入两套。我正在尝试实施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)没有回应。我该如何解决这个问题?

提前致谢。

1 个答案:

答案 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_newRDD[(String, String)]。收集后,您会收到Array[(String, String)]。当你使用

((t, w)) <- iter

tString,因此m.contains(t)将始终返回false

我看到的另一个问题是preservesPartitioning = true内的mapPartitions。有几种可能的情况:

  1. emp已分区,您也希望对joined进行分区。由于您将密钥从t更改为某个新值,因此无法保留分区,因此必须重新分区RDD。如果您使用preservesPartitioning = true输出RDD将导致错误的分区。
  2. emp已分区,但您不需要为joined进行分区。没有理由使用preservesPartitioning
  3. emp未分区。设置preservesPartitioning无效。