Spark群集按顺序将Number添加到文件中的每一行

时间:2017-02-16 06:40:31

标签: hadoop apache-spark pyspark

我有一个文件,其中包含每行中的名称,我想按顺序向每行添加数字。 例如,如果文件是这样的

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将它分配给不同的集群。所以我不确定这是否会奏效。所以有人可以告诉我如何实现这一目标?在此先感谢。

1 个答案:

答案 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