我是spark和scala的新手,刚开始学习......我在CDH 5.1.3上使用spark 1.0.0
我得到了一个名为dbTableKeyValueMap的广播rdd:RDD [(String,String)],我想使用dbTableKeyValueMap来处理我的文件RDD(每行有300多列)。这是代码:
val get = fileRDD.map({x =>
val tmp = dbTableKeyValueMap.lookup(x)
tmp
})
在本地运行此挂起和/或一段时间后会出错:
scala.MatchError: null
at org.apache.spark.rdd.PairRDDFunctions.lookup(PairRDDFunctions.scala:571)
我可以理解访问其中一个RDD会有问题,如果集合的位置和大小进入图片..对于我采取笛卡尔积不是选项,因为文件RDD中的记录很大(每行有300多列)。 ..就像我使用分布式缓存在setup方法中加载这个dbTableKeyValueMap并在hadoop java mapreduce代码的MAP中使用,我想在spark map中使用类似的方式...我无法找到引用类似用例的简单示例。 .. 我想逐个遍历fileRDD行,并在“每一列”上进行一些转换,祝福,查找等,以便进一步处理...... 或者我还可以使用dbTableKeyValueMap作为scala集合而不是spark RDD
请帮忙
答案 0 :(得分:6)
谢谢....最简单的事情就是将查找RDD转换为“scala集合”并且好好去!我可以使用任何RDD在内部转换中访问它....
val scalaMap = dbTableKeyValueMap.collectAsMap.toMap
val broadCastLookupMap = sc.broadcast(scalaMap)
val get = fileRDD.map({x =>
val tmp = broadCastLookupMap.value.get(x).head
tmp
})
这个简单的解决方案应该记录在早期学习者的某个地方。我花了一些时间来弄明白......
感谢您的帮助...
答案 1 :(得分:3)
我可以理解访问其中一个RDD会有问题,如果集合的地点和大小进入图片
不是真的。它根本行不通。 Spark不支持嵌套操作和转换。这意味着广播的RDD不能用于访问数据。
通常,您有三种选择:
使用join
(看起来这就是你需要的):
fileRDD.map(x => (x, null)).join(fileRDD)
使用可从所有工作人员访问的外部存储