Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在广播变量中查找值_Scala_Apache Spark_Broadcast - Fatal编程技术网

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
    output
    RDD
    将以错误的分区结束是的
  • 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