This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch rel/0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.12 by this push:
     new f295447  [To rel/0.12][IoTDB-1913] When exporting a amount of data, it 
will report network error or OOM (#4332)
f295447 is described below

commit f295447aafc1687e8b3f55b360601fe1cffa53f1
Author: Xuan Ronaldo <[email protected]>
AuthorDate: Mon Nov 8 14:59:51 2021 +0800

    [To rel/0.12][IoTDB-1913] When exporting a amount of data, it will report 
network error or OOM (#4332)
---
 .../main/java/org/apache/iotdb/tool/ExportCsv.java | 86 +++++++++++-----------
 1 file changed, 44 insertions(+), 42 deletions(-)

diff --git a/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java 
b/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java
index a6e5c86..d645447 100644
--- a/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java
+++ b/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java
@@ -36,11 +36,11 @@ import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.QuoteMode;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
+import java.io.*;
 import java.time.Instant;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
@@ -286,47 +286,62 @@ public class ExportCsv extends AbstractCsvTool {
    * @param index use to create dump file name
    */
   private static void dumpResult(String sql, int index) {
-
     final String path = targetDirectory + targetFile + index + ".csv";
     try {
-      SessionDataSet sessionDataSet = session.executeQueryStatement(sql);
-      List<List<Object>> records = loadDataFromDataSet(sessionDataSet);
-      writeCsvFile(null, records, path);
+      SessionDataSet sessionDataSet = session.executeQueryStatement(sql, 
10000);
+      writeCsvFile(sessionDataSet, path);
+      sessionDataSet.closeOperationHandle();
       System.out.println("Export completely!");
-    } catch (StatementExecutionException | IoTDBConnectionException e) {
+    } catch (StatementExecutionException | IoTDBConnectionException | 
IOException e) {
       System.out.println("Cannot dump result because: " + e.getMessage());
     }
   }
 
-  /**
-   * Load data from the result of query command.
-   *
-   * @param sessionDataSet
-   * @return
-   * @throws IoTDBConnectionException
-   * @throws StatementExecutionException
-   */
-  public static List<List<Object>> loadDataFromDataSet(SessionDataSet 
sessionDataSet)
-      throws IoTDBConnectionException, StatementExecutionException {
-    List<List<Object>> records = new ArrayList<>();
+  public static String timeTrans(Long time) {
+    String timestampPrecision = "ms";
+    switch (timeFormat) {
+      case "default":
+        return RpcUtils.parseLongToDateWithPrecision(
+            DateTimeFormatter.ISO_OFFSET_DATE_TIME, time, zoneId, 
timestampPrecision);
+      case "timestamp":
+      case "long":
+      case "number":
+        return String.valueOf(time);
+      default:
+        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(time), zoneId)
+            .format(DateTimeFormatter.ofPattern(timeFormat));
+    }
+  }
+
+  public static Boolean writeCsvFile(SessionDataSet sessionDataSet, String 
filePath)
+      throws IOException, IoTDBConnectionException, 
StatementExecutionException {
+    CSVPrinter printer =
+        CSVFormat.DEFAULT
+            .withFirstRecordAsHeader()
+            .withEscape('\\')
+            .withQuoteMode(QuoteMode.NONE)
+            .print(new PrintWriter(filePath));
+
     List<Object> headers = new ArrayList<>();
     List<String> names = sessionDataSet.getColumnNames();
     List<String> types = sessionDataSet.getColumnTypes();
 
-    if (needDataTypePrinted == true) {
+    if (needDataTypePrinted) {
       for (int i = 0; i < names.size(); i++) {
-        if (!names.get(i).equals("Time") && !names.get(i).equals("Device"))
+        if (!names.get(i).equals("Time") && !names.get(i).equals("Device")) {
           headers.add(String.format("%s(%s)", names.get(i), types.get(i)));
-        else headers.add(names.get(i));
+        } else {
+          headers.add(names.get(i));
+        }
       }
     } else {
       names.forEach(name -> headers.add(name));
     }
-    records.add(headers);
+    printer.printRecord(headers);
 
     while (sessionDataSet.hasNext()) {
       RowRecord rowRecord = sessionDataSet.next();
-      ArrayList<Object> record = new ArrayList<>();
+      ArrayList<String> record = new ArrayList<>();
       if (rowRecord.getTimestamp() != 0) {
         record.add(timeTrans(rowRecord.getTimestamp()));
       }
@@ -345,24 +360,11 @@ public class ExportCsv extends AbstractCsvTool {
                   record.add("");
                 }
               });
-      records.add(record);
+      printer.printRecord(record);
     }
-    return records;
-  }
 
-  public static String timeTrans(Long time) {
-    String timestampPrecision = "ms";
-    switch (timeFormat) {
-      case "default":
-        return RpcUtils.parseLongToDateWithPrecision(
-            DateTimeFormatter.ISO_OFFSET_DATE_TIME, time, zoneId, 
timestampPrecision);
-      case "timestamp":
-      case "long":
-      case "number":
-        return String.valueOf(time);
-      default:
-        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(time), zoneId)
-            .format(DateTimeFormatter.ofPattern(timeFormat));
-    }
+    printer.flush();
+    printer.close();
+    return true;
   }
 }

Reply via email to