我是Spark-Java
的初学者,我想从Java 8
的列表中获得一个子列表。然后,我将其转换为RDD。我在下面的代码中做到了:
List<CSVRecord> inputRecords = readInputLayer(actorSystem, inputCatalog, inputCatalogVersion);
LOGGER.info("Number of partition " +inputRecords.size());
List<CSVRecord> inputRecordsTmp = inputRecords.stream().limit(100).collect(Collectors.toList());
JavaRDD<CSVRecord> inputRecordsJavaRDD = JavaSparkContext.emptyRDD();
for (List<CSVRecord> partition: inputRecordsTmp ){
JavaRDD<CSVRecord> inputRecordsTmpRDD = (JavaRDD<CSVRecord>) JavaSparkContext.parallelize(partition);
inputRecordsJavaRDD = JavaSparkContext.union(inputRecordsJavaRDD,inputRecordsTmpRDD);
}
LOGGER.info("Number of lines to insert JAVA RDD =" +inputRecordsJavaRDD.count());
但是我在循环中遇到了一个错误,
它不接受List<CSVRecord> partition:
Incompatible types:
Required: org.apache.commons.csvRecord
Found: java.util.list <org.apache.commons.csvRecord>
我该如何纠正? 谢谢
答案 0 :(得分:0)
编辑:只是看了一下文档。 parallelize
实际上接受一个列表,但这仅意味着您根本不需要foreach。您应该能够直接将inputRecordsTmp
传递给并行化并从中获取RDD。
不过,由于foreach的格式不正确,因此我将其留在此处以获取更多信息:
首先,您的for-each-loop对我而言似乎并不正确。用Java编写for-each-loop时,冒号之前的部分应该是您要遍历的集合中元素的类型。
在您的情况下,您有一个包含CSVRecord对象的列表。在for-each中,您基本上是说“针对此CSVRecord对象列表中的每个CSVRecord ...”。但是,您已经编写了“对于CSVRecord对象列表中的每个CSVRecord对象列表...”,这没有什么意义。
Java已经知道inputRecordsTmp
是CSVRecords的列表,因此无需在任何地方再次指定。相反,您想要告诉的是,对于列表中的每个对象,您想要将该对象提取到一个变量中(在您的情况下为partition
),以便可以在循环中使用该提取的对象。
所以不要写
for (List<CSVRecord> partition: inputRecordsTmp ){
你必须写
for (CSVRecord record: inputRecordsTmp ){
此可能解决了您的问题。如果没有,您能否添加有关哪一行完全失败的信息?