You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ja...@apache.org on 2012/06/17 08:49:06 UTC

svn commit: r1351062 - in /sqoop/trunk/src: java/org/apache/sqoop/tool/ExportTool.java test/com/cloudera/sqoop/TestExport.java

Author: jarcec
Date: Sun Jun 17 06:49:06 2012
New Revision: 1351062

URL: http://svn.apache.org/viewvc?rev=1351062&view=rev
Log:
SQOOP-503: --columns argument support for export.

(Cheolsoo Park via Jarek Jarcec Cecho)

Modified:
    sqoop/trunk/src/java/org/apache/sqoop/tool/ExportTool.java
    sqoop/trunk/src/test/com/cloudera/sqoop/TestExport.java

Modified: sqoop/trunk/src/java/org/apache/sqoop/tool/ExportTool.java
URL: http://svn.apache.org/viewvc/sqoop/trunk/src/java/org/apache/sqoop/tool/ExportTool.java?rev=1351062&r1=1351061&r2=1351062&view=diff
==============================================================================
--- sqoop/trunk/src/java/org/apache/sqoop/tool/ExportTool.java (original)
+++ sqoop/trunk/src/java/org/apache/sqoop/tool/ExportTool.java Sun Jun 17 06:49:06 2012
@@ -133,6 +133,10 @@ public class ExportTool extends com.clou
         .hasArg().withDescription("Table to populate")
         .withLongOpt(TABLE_ARG)
         .create());
+    exportOpts.addOption(OptionBuilder.withArgName("col,col,col...")
+        .hasArg().withDescription("Columns to export to table")
+        .withLongOpt(COLUMNS_ARG)
+        .create());
     exportOpts.addOption(OptionBuilder.withArgName("n")
         .hasArg().withDescription("Use 'n' map tasks to export in parallel")
         .withLongOpt(NUM_MAPPERS_ARG)
@@ -227,6 +231,14 @@ public class ExportTool extends com.clou
         out.setTableName(in.getOptionValue(TABLE_ARG));
       }
 
+      if (in.hasOption(COLUMNS_ARG)) {
+        String[] cols= in.getOptionValue(COLUMNS_ARG).split(",");
+        for (int i=0; i<cols.length; i++) {
+          cols[i] = cols[i].trim();
+        }
+        out.setColumns(cols);
+      }
+
       if (in.hasOption(NUM_MAPPERS_ARG)) {
         out.setNumMappers(Integer.parseInt(in.getOptionValue(NUM_MAPPERS_ARG)));
       }

Modified: sqoop/trunk/src/test/com/cloudera/sqoop/TestExport.java
URL: http://svn.apache.org/viewvc/sqoop/trunk/src/test/com/cloudera/sqoop/TestExport.java?rev=1351062&r1=1351061&r2=1351062&view=diff
==============================================================================
--- sqoop/trunk/src/test/com/cloudera/sqoop/TestExport.java (original)
+++ sqoop/trunk/src/test/com/cloudera/sqoop/TestExport.java Sun Jun 17 06:49:06 2012
@@ -793,4 +793,63 @@ public class TestExport extends ExportJo
     assertColMinAndMax(forIdx(0), genFloat);
     assertColMinAndMax(forIdx(1), genNumeric);
   }
+
+  public void testColumnsExport() throws IOException, SQLException {
+    final int TOTAL_COLUMNS = 3;
+    final int TOTAL_RECORDS = 10;
+
+    // This class is used to generate a column whose entries have unique
+    // sequential values that are computed as follows:
+    //  (row number * total number of columns) + column number
+    class MultiColumnGenerator implements ColumnGenerator {
+      private int col;
+      MultiColumnGenerator(int col) {
+        this.col = col;
+      }
+      public String getExportText(int rowNum) {
+        return new Integer(rowNum * TOTAL_COLUMNS + col).toString();
+      }
+      public String getVerifyText(int rowNum) {
+        return new Integer(rowNum * TOTAL_COLUMNS + col).toString();
+      }
+      public String getType() {
+        return "INTEGER";
+      }
+    }
+
+    // This class is used to generate a null column.
+    class NullColumnGenerator implements ColumnGenerator {
+      public String getExportText(int rowNum) {
+        return null;
+      }
+      public String getVerifyText(int rowNum) {
+        return null;
+      }
+      public String getType() {
+        return "INTEGER";
+      }
+    }
+
+    // Generate an input file that only contains partial columns: col0
+    // and col2. Export these columns to the DB w/ the --columns option.
+    // Finally, verify that these two columns are exported properly. In
+    // addition, verify that the values of col1 in the DB are all null
+    // as they are not exported.
+    ColumnGenerator gen0 = new MultiColumnGenerator(0);
+    ColumnGenerator gen1 = new MultiColumnGenerator(1);
+    ColumnGenerator gen2 = new MultiColumnGenerator(2);
+
+    createTextFile(0, TOTAL_RECORDS, false, gen0, gen2);
+    createTable(gen0, gen1, gen2);
+
+    String columnsStr = "id,msg," + forIdx(0) + "," + forIdx(2);
+    runExport(getArgv(true, 10, 10, "--columns", columnsStr));
+
+    ColumnGenerator genNull = new NullColumnGenerator();
+
+    verifyExport(TOTAL_RECORDS);
+    assertColMinAndMax(forIdx(0), gen0);
+    assertColMinAndMax(forIdx(2), gen2);
+    assertColMinAndMax(forIdx(1), genNull);
+  }
 }