RDD转换和操作只能由map中的驱动程序或for循环调用

时间:2017-04-04 09:55:33

标签: scala apache-spark

错误:RDD转换和操作只能由驱动程序调用,而不能在其他转换内部调用;例如,rdd1.map(x => rdd2.values.count() * x)无效,因为无法在rdd1.map转换内执行值转换和计数操作。有关详细信息,请参阅SPARK-5063

val omnitureStitchedEntriesWithExposures: List[OmnitureFeedOutputEntry] = listEntries.map(entry => {
    val guid = entry.getProp12()
    val uisObjectListForGuid: Seq[MappedExposureEntry] = uisExposures.lookup(guid)
    uisObjectListForGuid match {
      case Nil =>
        logInfo("task=uis_omniture_guid_match, guid=" + guid + " visitorid=" + entry.getXVisitorId())
        entry
      case _ => OmnitureFeedOutputEntry.cloneWithExposures(entry, uisObjectListForGuid)
    }
  })

1 个答案:

答案 0 :(得分:0)

实际上不要混淆驱动程序执行这些语句它只会将所有这些转换添加到DAG中,每当您调用操作时它将在集群上执行整个DAG或者我们可以说工作节点。第二点是的,您不能在转换和操作中使用RDD转换和操作,因为该关闭将在工作节点上运行,并且RDD不可序列化。