我有一个文件,其中包含每行中的名称,我想按顺序向每行添加数字。 例如,如果文件是这样的
a
b
c
d
我希望它能实现这个目标
a,1
b,2
c,3
d,4
我已编写此代码来实现此目的
val lines = sc.textFile("data.txt")
val pair = lines.zipWithIndex().map{case(i,line) => i.toString +","+line}
pair.collect()
但是如你所知,Spark将它分配给不同的集群。所以我不确定这是否会奏效。所以有人可以告诉我如何实现这一目标?在此先感谢。
答案 0 :(得分:3)
如果您将运行此代码,您将获得您期望的输出。 即使spark在群集中分配任务,但不会以编程方式影响任何内容。在您的示例中,如果您使用2个工作节点运行,则文件将分为两个分区,这两个分区将存储在每个相应的工作节点上。现在,当程序运行并且驱动程序遇到zipWithIndex时,它将确保工作人员将获得有关该文件的其他分区的信息,因为它是zipWithIndex的要求。
在spark中,不同的转换和操作有不同的要求,主节点确保满足这些要求,如同不同需要重新排列数据以确保只有一个副本。
另一件事,如果你只想用行号制作一对单词,那么你就不需要地图了。只有这个也可以使用
pair = lines.zipWithIndex();
我在java中使用上面的代码行运行了没有map的示例,它给了我正确的输出。虽然行号以0.开头但仍然证明了工作节点数对顺序显示行号没有任何影响。
// output of worker 1 part-00000
a,0
b,1
//output of worker 2 part-00001
c,2
d,3