保存Spark Java RDD,以便将每个RDD值保存到单独文件夹中的单独文件中

时间:2018-06-22 20:29:52

标签: java file apache-spark rdd

我正在将Spark 2.3与Java 1.8一起使用

我有一个CSV记录的RDD,说:

JavaRDD<CsvRecordsPerApp> csvRecordsRdd

每个CsvRecordsPerApp都有多个值:

class CsvRecordsPerApp implements Serializable {
    String customerName;
    String supplierName;
    String otherFieldName;
} 

我想将其保存在多个文件夹中,以便将每个RDD保存到3个单独的文件夹中,例如

- customerNames\part-0000
- customerNames\part-0001
...
- supplierNames\part-0000
- supplierNames\part-0001
...

- otherFieldNames\part-0000
- otherFieldNames\part-0001
...

但是当我在下面进行操作时,它将所有输出文件保存为单个文件:

JavaRDD<CsvRecordsPerApp> csvRecordsRdd = ...
csvRecordsRdd.saveAsTextFile("file-name");

喜欢:

file-name/0000
file-name/0001
..

我试图将csvRecordsRdd映射到不同的值并保存3次,如下所示:

JavaRDD<String> customerNameRdd = csvRecordsRdd.map(csv -> csv.getCustomerName());
customerNameRdd.saveAsTextFile("customerNames");

JavaRDD<String> supplierNameRdd = csvRecordsRdd.map(csv -> csv.getSupplierName());
supplierNameRdd.saveAsTextFile("supplierNames");

JavaRDD<String> otherFieldNameRdd = csvRecordsRdd.map(csv -> csv.getOtherFieldName());
otherFieldNameRdd.saveAsTextFile("otherFieldName");

这里的问题是它重新计算RDD 3次,我有三次输入!

然后停止重新计算,我尝试了以下缓存,但是它不起作用,仍然计算了3次:

csvRecordsRdd.persist(StorageLevel.MEMORY_AND_DISK()); or csvRecordsRdd.cache();

我正在寻找解决问题的想法

1 个答案:

答案 0 :(得分:-1)

这里是缓存工作的解决方案(抱歉,我忘了更新)。

因为我将spart-submit驱动程序执行程序的内存等其他配置从1 gb(默认)更改为20 gb(取决于您系统的可用性,例如在我的台式机上,我将其增加到5 gb,但在EMR上我将其增加到20 gb或更多)。

我认为这只是一种解决方法,因为它缓存对象。缓存有一个限制,因此它可能无法处理更大的数据,并且肯定需要更大的m / c。

所以,请提出更多更好的解决方案。