我正在将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();
我正在寻找解决问题的想法
答案 0 :(得分:-1)
这里是缓存工作的解决方案(抱歉,我忘了更新)。
因为我将spart-submit驱动程序执行程序的内存等其他配置从1 gb(默认)更改为20 gb(取决于您系统的可用性,例如在我的台式机上,我将其增加到5 gb,但在EMR上我将其增加到20 gb或更多)。
我认为这只是一种解决方法,因为它缓存对象。缓存有一个限制,因此它可能无法处理更大的数据,并且肯定需要更大的m / c。
所以,请提出更多更好的解决方案。