不兼容的类型:列出CSVRecords Java

时间:2019-03-21 13:15:37

标签: java list apache-spark rdd

我是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>

我该如何纠正? 谢谢

1 个答案:

答案 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 ){

可能解决了您的问题。如果没有,您能否添加有关哪一行完全失败的信息?