Apache Spark:saveAsTextFile()和filter()的问题

时间:2016-06-07 08:49:33

标签: java apache-spark

当我尝试使用函数saveAsTextFile()时,即使RDD包含元组,我也总是得到空文件:

myRDD.saveAsTextFile("C:/Users/pc/Desktop/chna.txt"); 

可能是什么原因?

让我们假设它有效并且数据已在文本文件中注册,我如何通过shell或通过我的代码检索它(注意:我使用的是Java)?

是否存在通过我的代码修改文本文件的任何解决方案(总是使用Java),我尝试了以下代码但得到了java.io.NotSerializableException,还有其他可能的解决方案吗?

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("C:/Users/pc/Desktop/chn.txt", true)); 
pairsRDD.foreach(x -> bufferedWriter.write(x._1+" "+x._2)); 
bufferedWriter.newLine();  // ... 
bufferedWriter.close(); 

当我使用这行代码时:

JavaPairRDD<Integer, String> filterRDD = pairsRDD.filter((x,y) -> (x._1.equals(y._1))&&(x._2.equals(y._2)))));

我有一个IOException,是因为RDD是空的吗?或者用于过滤的条件是错误的?

我该如何解决这个问题呢?原因是什么?

  

java.io.IOException:找不到可执行文件null \ bin \ winutils.exe   在Hadoop二进制文件中。

当我创建RDD时,它也会占用第一行(字段名称),如何避免这种情况?因为我只想采用包含值的行。

1 个答案:

答案 0 :(得分:0)

saveAsTextFile()将文件夹的路径作为参数,而不是文件的路径。它实际上会在该文件夹中为每个分区写一个文件,名为part-r-xxxxx(xxxxx为00000,无论你拥有多少个分区)。

要再次阅读您的数据,使用sparkContext.textFile().wholeTextFile()方法非常简单(取决于您是要阅读单个文件还是完整文件夹)。

在spark中没有简单的解决方案来修改文件,因为你不能控制任何spark写入的命名,而spark首先禁止在非空文件夹中写入。

如果你真的想这样做,最好的办法就是不要使用spark,因为它不是分布式计算的问题,而是使用sed或awk来进行文件编辑,这将是一个数量级更高效,更有效率。