You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by to...@apache.org on 2010/04/27 19:33:35 UTC
svn commit: r938576 - in /hadoop/mapreduce/trunk: CHANGES.txt
src/java/org/apache/hadoop/mapreduce/lib/db/OracleDBRecordReader.java
src/java/org/apache/hadoop/mapreduce/lib/db/OracleDataDrivenDBRecordReader.java
Author: tomwhite
Date: Tue Apr 27 17:33:35 2010
New Revision: 938576
URL: http://svn.apache.org/viewvc?rev=938576&view=rev
Log:
MAPREDUCE-1728. Oracle timezone strings do not match Java. Contributed by Aaron Kimball.
Modified:
hadoop/mapreduce/trunk/CHANGES.txt
hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDBRecordReader.java
hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDataDrivenDBRecordReader.java
Modified: hadoop/mapreduce/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/CHANGES.txt?rev=938576&r1=938575&r2=938576&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/CHANGES.txt (original)
+++ hadoop/mapreduce/trunk/CHANGES.txt Tue Apr 27 17:33:35 2010
@@ -599,6 +599,9 @@ Trunk (unreleased changes)
MAPREDUCE-1397. NullPointerException observed during task failures.
(Amareshwari Sriramadasu via vinodkv)
+ MAPREDUCE-1728. Oracle timezone strings do not match Java.
+ (Aaron Kimball via tomwhite)
+
Release 0.21.0 - Unreleased
INCOMPATIBLE CHANGES
Modified: hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDBRecordReader.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDBRecordReader.java?rev=938576&r1=938575&r2=938576&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDBRecordReader.java (original)
+++ hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDBRecordReader.java Tue Apr 27 17:33:35 2010
@@ -20,10 +20,7 @@ package org.apache.hadoop.mapreduce.lib.
import java.io.IOException;
import java.sql.Connection;
-import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.TimeZone;
import java.lang.reflect.Method;
import org.apache.hadoop.conf.Configuration;
@@ -35,13 +32,16 @@ import org.apache.commons.logging.LogFac
*/
public class OracleDBRecordReader<T extends DBWritable> extends DBRecordReader<T> {
+ /** Configuration key to set to a timezone string. */
+ public static final String SESSION_TIMEZONE_KEY = "oracle.sessionTimeZone";
+
private static final Log LOG = LogFactory.getLog(OracleDBRecordReader.class);
public OracleDBRecordReader(DBInputFormat.DBInputSplit split,
Class<T> inputClass, Configuration conf, Connection conn, DBConfiguration dbConfig,
String cond, String [] fields, String table) throws SQLException {
super(split, inputClass, conf, conn, dbConfig, cond, fields, table);
- setSessionTimeZone(conn);
+ setSessionTimeZone(conf, conn);
}
/** Returns the query for selecting the records from an Oracle DB. */
@@ -96,10 +96,12 @@ public class OracleDBRecordReader<T exte
/**
* Set session time zone
- * @param conn Connection object
- * @throws SQLException instance
+ * @param conf The current configuration.
+ * We read the 'oracle.sessionTimeZone' property from here.
+ * @param conn The connection to alter the timezone properties of.
*/
- public static void setSessionTimeZone(Connection conn) throws SQLException {
+ public static void setSessionTimeZone(Configuration conf,
+ Connection conn) throws SQLException {
// need to use reflection to call the method setSessionTimeZone on
// the OracleConnection class because oracle specific java libraries are
// not accessible in this context.
@@ -114,18 +116,21 @@ public class OracleDBRecordReader<T exte
}
// Need to set the time zone in order for Java
- // to correctly access the column "TIMESTAMP WITH LOCAL TIME ZONE"
- String clientTimeZone = TimeZone.getDefault().getID();
+ // to correctly access the column "TIMESTAMP WITH LOCAL TIME ZONE".
+ // We can't easily get the correct Oracle-specific timezone string
+ // from Java; just let the user set the timezone in a property.
+ String clientTimeZone = conf.get(SESSION_TIMEZONE_KEY, "GMT");
try {
method.setAccessible(true);
method.invoke(conn, clientTimeZone);
- LOG.info("Time zone has been set");
+ LOG.info("Time zone has been set to " + clientTimeZone);
} catch (Exception ex) {
LOG.warn("Time zone " + clientTimeZone +
- " could not be set on oracle database.");
- LOG.info("Setting default time zone: UTC");
+ " could not be set on Oracle database.");
+ LOG.warn("Setting default time zone: GMT");
try {
- method.invoke(conn, "UTC");
+ // "GMT" timezone is guaranteed to exist.
+ method.invoke(conn, "GMT");
} catch (Exception ex2) {
LOG.error("Could not set time zone for oracle connection", ex2);
// rethrow SQLException
Modified: hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDataDrivenDBRecordReader.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDataDrivenDBRecordReader.java?rev=938576&r1=938575&r2=938576&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDataDrivenDBRecordReader.java (original)
+++ hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapreduce/lib/db/OracleDataDrivenDBRecordReader.java Tue Apr 27 17:33:35 2010
@@ -40,6 +40,6 @@ public class OracleDataDrivenDBRecordRea
"ORACLE");
// Must initialize the tz used by the connection for Oracle.
- OracleDBRecordReader.setSessionTimeZone(conn);
+ OracleDBRecordReader.setSessionTimeZone(conf, conn);
}
}