You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by bl...@apache.org on 2012/03/13 21:36:32 UTC
svn commit: r1300345 -
/incubator/sqoop/trunk/src/java/org/apache/sqoop/manager/DirectPostgresqlManager.java
Author: blee
Date: Tue Mar 13 20:36:32 2012
New Revision: 1300345
URL: http://svn.apache.org/viewvc?rev=1300345&view=rev
Log:
SQOOP-448 boolean fields get nullified during postgres direct import into hive.
Modified:
incubator/sqoop/trunk/src/java/org/apache/sqoop/manager/DirectPostgresqlManager.java
Modified: incubator/sqoop/trunk/src/java/org/apache/sqoop/manager/DirectPostgresqlManager.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/trunk/src/java/org/apache/sqoop/manager/DirectPostgresqlManager.java?rev=1300345&r1=1300344&r2=1300345&view=diff
==============================================================================
--- incubator/sqoop/trunk/src/java/org/apache/sqoop/manager/DirectPostgresqlManager.java (original)
+++ incubator/sqoop/trunk/src/java/org/apache/sqoop/manager/DirectPostgresqlManager.java Tue Mar 13 20:36:32 2012
@@ -28,6 +28,7 @@ import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -166,6 +167,48 @@ public class DirectPostgresqlManager
return sb.toString();
}
+ /**
+ * We need to modify boolean results to 'TRUE' and 'FALSE' instead
+ * of postgres t/f syntax. Otherwise hive will ignore them and import nulls
+ *
+ * https://issues.cloudera.org/browse/SQOOP-43
+ *
+ *
+ * @param cols
+ * @return
+ */
+ private String getSelectListColumnsStr(String [] cols, String tableName) {
+ if (null == cols || tableName == null) {
+ return null;
+ }
+ Map<String, String> columnTypes = getColumnTypeNamesForTable(tableName);
+
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (String col : cols) {
+ if (!first) {
+ sb.append(", ");
+ }
+ if (columnTypes.get(col) == null) {
+ LOG.error("can not find " + col + " in type medatadata");
+ sb.append(col);
+ } else {
+ if ("bool".equalsIgnoreCase(columnTypes.get(col))) {
+ sb.append(String.format("case when %s=true then 'TRUE' "
+ + "when %s=false then 'FALSE' end as %s", col, col, col));
+ } else if ("bit".equalsIgnoreCase(columnTypes.get(col))) {
+ sb.append(String.format("case when %s=B'1' then 'TRUE' "
+ + "when %s=B'0' then 'FALSE' end as %s", col, col, col));
+ } else {
+ sb.append(col);
+ }
+ }
+ first = false;
+ }
+
+ return sb.toString();
+ }
+
/**
* @return the Postgresql-specific SQL command to copy the
@@ -190,32 +233,22 @@ public class DirectPostgresqlManager
sb.append("COPY ");
String whereClause = this.options.getWhereClause();
- if (whereClause != null && whereClause.length() > 0) {
+ if (whereClause == null || whereClause.length() > 0) {
+ whereClause = "1=1";
+ }
// Import from a SELECT QUERY
sb.append("(");
sb.append("SELECT ");
if (null != cols) {
- sb.append(getColumnListStr(cols));
+ sb.append(getSelectListColumnsStr(cols, tableName));
} else {
sb.append("*");
}
-
sb.append(" FROM ");
sb.append(escapedTableName);
sb.append(" WHERE ");
sb.append(whereClause);
sb.append(")");
- } else {
- // Import just the table.
- sb.append(escapedTableName);
- if (null != cols) {
- // specify columns.
- sb.append("(");
- sb.append(getColumnListStr(cols));
- sb.append(")");
- }
- }
-
// Translate delimiter characters to '\ooo' octal representation.
sb.append(" TO STDOUT WITH DELIMITER E'\\");
sb.append(Integer.toString((int) this.options.getOutputFieldDelim(), 8));