Scala 在广播变量中查找值
我想通过应用广播变量连接两个集合。我正试图实施来自中国的第一个建议Scala 在广播变量中查找值,scala,apache-spark,broadcast,Scala,Apache Spark,Broadcast,我想通过应用广播变量连接两个集合。我正试图实施来自中国的第一个建议 val emp_newBC=sc.broadcast(emp_new.collectAsMap()) val joined=emp.mapPartitions({iter=> val m=环境管理值 为了{ ((t,w)) val m=环境管理值 为了{ 像这样的怎么样 val emp_newBC = sc.broadcast(emp_new.groupByKey.collectAsMap) val joined = emp.
val emp_newBC=sc.broadcast(emp_new.collectAsMap())
val joined=emp.mapPartitions({iter=>
val m=环境管理值
为了{
((t,w))
val m=环境管理值
为了{
像这样的怎么样
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))
t
是一个字符串,因此m.contains(t)
将始终返回false
我看到的另一个问题是preservespatiting=true
内部mapPartitions
emp
已分区,您希望join
也被分区。由于您将键从t
更改为某个新值,因此无法保留分区,因此必须重新分区生成的RDD
。如果使用preservespatiting=true
outputRDD
将以错误的分区结束是的
emp
已分区,但您不需要对加入的进行分区。没有理由使用preservespatiting
emp
未分区。设置preserveSpatiting
无效
val emp_newBC=sc.broadcast(emp_new.groupByKey.collectAsMap)部分仍然返回缺少的数据。我尝试使用一个小数据集,我预期广播变量中有354行,但它返回312行。我认为原因仍然是有效的,正如我在文章中写的第二个链接中所述。难道不可能只使用collect()吗是的,emp必须被分区。事实上,emp有500个分区。我不知道如何重新分区新的rdd。我应该重新分区吗?它应该覆盖所有的值。当你运行emp\u newBC.value.values.map(u.size)时,你会得到什么.sum
?关于分区,你有分区器吗?emp.partitioner
的输出是什么?为了控制大小,我通过val oo=emp_newBC.value
检查了它,结果它显示的数字仍然较少。但是,当我运行你的代码时,它工作得非常好。现在我想知道这是否是一个好方法…joined.repartition(sc.defaultParallelism*500)
我是否应该像开始时那样用500连接分区?如果你不使用分区器,这里就没有别的事可做了。关于广播地图,它应该可以正常工作,这是这里唯一有效的解决方案。我得到的emp是val emp=sc.textFile(“text.txt”,500)。map(line=>(line.split(“\t”)(5),line.split(“\t”)(0)).distinct()。但是emp.partitioner返回null。当我监视UI时,它确实显示500个分区。我有点困惑。如果你不介意的话,我还有一个小问题。现在火花溢出,无法完成任务,因为emp太大。增加分区数(例如,从500增加到5000)对它有什么影响?
val emp_newBC = sc.broadcast(emp_new.collect())
val joined = emp.mapPartitions({ iter =>
val m = emp_newBC.value
for {
((t, w)) <- iter
if m.contains(t)
amk = m.indexOf(t)
} yield ((w + '-' + emp_newBC.value(amk)),1) //yield ((t, w), (m.get(t).get)) //((w + '-' + m.get(t).get),1)
}, preservesPartitioning = true)
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))
((t, w)) <- iter