【问题标题】:Foreach operation in Spark/scala [duplicate]Spark / scala中的Foreach操作[重复]
【发布时间】:2016-05-06 20:43:12
【问题描述】:

我正在尝试读取文件并将每一行连接到一个字符串中,下面是代码:

var str:string

val RDD1 = sc.textFile("file_path").foreach{line => 
str += line
Println (str)             // prints string one by one after concatenation
}

Println(str)                // empty string

输入文件中的所有行都连接在字符串中,我在 foreach 本身中使用 Println 语句检查了该字符串。 但是当我在 foreach 之外打印字符串变量时,它是空的。 有什么理由吗?理想情况下,它应该与填充的值一起打印。

  1. 还有一个问题,如果我在上面的代码中使用 .map 而不是 .foreach 会怎样。当我在这种情况下尝试时,字符串中没有填充任何内容,即使 .map 代码中的 println 语句也打印为空。我的理解是地图也应该在这种情况下工作?

提前致谢

【问题讨论】:

  • 这个问题设计得很糟糕。您提供的代码不会按原样编译。请尝试花一些时间自己进行一些调查,并至少尝试使其运行。否则问题可能会被关闭或忽略。
  • 每个工作人员都有一个单独的 var str 副本,并且不会发回。请参阅此问题stackoverflow.com/a/29418504/21755。真的,这应该是显而易见的——Spark 的全部意义在于将工作分配给多个工作人员,并且像这样共享一些可变的全局变量会扼杀任何效率提升。

标签: scala apache-spark


【解决方案1】:

我认为你是 spark 的新手,所以首先了解 spark 的概念,如转换(map、flatmap、reduceby..)、action(collect,take..),而不是实现代码。

您的方案无效,但您希望连接所有行,此代码将帮助您

val rddOfString = sc.textFile("file_path").map{
line => 
(1,line)//add unique key on each line
}.reduceByKey(_+_)//use reduce by for concatenation all lines
.map(_._2)//select your concat string
.collect//collect your data

您将获得字符串数组,其中第一个索引包含您的输出

val str=rddOfString(0)

【讨论】:

  • 不要 (_+_) 使用字符串。
  • @Gabber:感谢代码,对我来说它有效,但使用 str = rddOfString.first() 而不是 rddOfString(0)。是的,我是 spark 新手,但我对 foreach 和 map 之类的转换有基本的了解,这个问题的原因是 foreach 也应该像 foreach 在这种情况下适用于每个参数一样工作。
  • @yuvrajrajpurohit 你看我的评论了吗?它行不通,因为您不能像这样在工作人员之间共享可变值。
  • @zero 可能会问你,为什么?
  • @yuvrajrajpurohit rddOfString 是字符串数组,你可以先得到你的输出以及 rdd(0),但是如果答案是可以接受的,请接受它
猜你喜欢
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
相关资源
最近更新 更多