Resultset пишет больше записей в CSV

Я пытаюсь прочитать данные из таблицы, в которой содержится ~ 13 миллионов записей. Я использовал setFetchSize для пакетного чтения записей, выполняя поиск и записывая их в файл csv. Но вывод csv генерируется с более чем 50 миллионами записей, чего не ожидается. Я подозреваю, что итерация работает некорректно. Любая помощь будет оценена по достоинству.

def processRecords(ParamHelper params){

                 try {
                        CSVWriter writer;
                        writer = new CSVWriter(new FileWriter(params.outputDir.getAbsolutePath()+"/Records_fact.csv"),(Character)'\t',(Character)'\u0000',(Character)'\n');

                String contractRateSql = "select contract_id,season from table";

                ResultSet resRecords = stmt.executeQuery(contractRateSql);
                Map <String,Map<String,String>> masterRecords = new HashMap<String,Map<String,String>>();
                Map<String,String> existingRecords = null;
                int count = 0;
                resRecords.setFetchSize(10000)
                while(resRecords.next()) {
                        try{
                                existingRecords = new HashMap<String,String>();
                                existingRecords.put("cont_id",resRateRecords.getString("contract_id"));
                                existingRecords.put("season",resRateRecords.getString("season"));
                                masterRecords.put(resRecords.getString("contract_id")+"#"+count++,existingRecords);
                        }

                        catch(Exception e){
                                e.printStackTrace();
                        }

                        masterRecords.each{ k, v ->
                                try{
                                    //some process 
                                }catch(Exception e){

                                        e.printStackTrace();

                                }
                        }

                        if (valueList.size()>0)
                                writer.writeAll(valueList);



                        try {
                        if (resRateRecords != null) resRateRecords.close();
                        } catch (Exception e) {

                        };


                }
                writer.close();
                catch(Exception e){
                        e.printStackTrace();
                        println("Occured while fetching the data");
                }

        }
    }

Дает ли он столько результатов при повторном запуске после удаления файла Records_fact.csv? Вы вызываете new FileWriter(path, true), что означает, что он добавит данные в ваш уже существующий файл.

Mark 18.12.2018 16:00

Да, каждый раз он дает столько результатов. Я даже пробовал использовать новый FileWriter (path).

marjun 18.12.2018 16:06

Что такое valueList? Вы пишете только тогда, когда размер этого > 0, но я не вижу, чтобы вы добавляли к нему данные где-либо, также после того, как вы записали данные, вы никогда не очищаете valueList.

Mark 18.12.2018 16:09

Простой вопрос: вы сказали, что ваш выходной CSV-файл содержит 50 миллионов записей, действительно ли это 50 миллионов записей или 50 миллионов строк. Потому что, если в поле в вашей базе данных есть символ новой строки, вы получите одну запись, занимающую две строки в выходном файле (т.е. a, b, «это поле занимает \ nдве строки», c, d)

Scott Conway 14.01.2019 22:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
76
0

Другие вопросы по теме