当我尝试使用函数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时,它也会占用第一行(字段名称),如何避免这种情况?因为我只想采用包含值的行。
答案 0 :(得分:0)
saveAsTextFile()
将文件夹的路径作为参数,而不是文件的路径。它实际上会在该文件夹中为每个分区写一个文件,名为part-r-xxxxx(xxxxx为00000,无论你拥有多少个分区)。
要再次阅读您的数据,使用sparkContext.textFile()
或.wholeTextFile()
方法非常简单(取决于您是要阅读单个文件还是完整文件夹)。
在spark中没有简单的解决方案来修改文件,因为你不能控制任何spark写入的命名,而spark首先禁止在非空文件夹中写入。
如果你真的想这样做,最好的办法就是不要使用spark,因为它不是分布式计算的问题,而是使用sed或awk来进行文件编辑,这将是一个数量级更高效,更有效率。