Несовместимые типы: список CSVRecords Java - PullRequest
0 голосов
/ 21 марта 2019

Я новичок в 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 голосов
/ 21 марта 2019

РЕДАКТИРОВАТЬ: Просто взглянул на документациюparallelize фактически принимает список, но это означает, что вам вообще не нужен foreach.Вы должны иметь возможность просто передать inputRecordsTmp прямо в распараллеливание и получить из него свой RDD.

Тем не менее, поскольку foreach сформулирован неправильно, я оставлю это здесь для получения дополнительной информации:

Прежде всего, ваш цикл для каждого не выглядит для меня совершенно правильным.При написании цикла for-each в Java предполагается, что часть перед двоеточием относится к типу элемента в коллекции, для которой вы выполняете итерацию.

В вашем случае у вас есть List, которыйсодержит объекты CSVRecord.В основном для каждого вы говорите «для каждого CSVRecord в этом списке объектов CSVRecord ...».Однако вы написали «для каждого Списка объектов CSVRecord в этом списке объектов CSVRecord ...», что не имеет особого смысла.

Java уже знает, что inputRecordsTmp является списком CSVRecords,поэтому нет необходимости указывать это снова где-либо.Вместо этого вы хотите сказать, что для каждого объекта в списке вы хотите извлечь этот объект в переменную (partition в вашем случае), чтобы вы могли использовать этот извлеченный объект внутри цикла.

Поэтому вместо того, чтобы писать

for (List<CSVRecord> partition: inputRecordsTmp ){

Вы должны написать

for (CSVRecord record: inputRecordsTmp ){

Это может решить вашу проблему.Если нет, не могли бы вы добавить информацию о том, какая именно строка не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...