/** * Create a data file in SequenceFile format that gets exported to the db. * * @param fileNum the number of the file (for multi-file export). * @param numRecords how many records to write to the file. * @param className the table class name to instantiate and populate for each record. */ private void createSequenceFile(int fileNum, int numRecords, String className) throws IOException { try { // Instantiate the value record object via reflection. Class cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); SqoopRecord record = (SqoopRecord) ReflectionUtils.newInstance(cls, new Configuration()); // Create the SequenceFile. Configuration conf = new Configuration(); conf.set("fs.default.name", "file:///"); FileSystem fs = FileSystem.get(conf); Path tablePath = getTablePath(); Path filePath = new Path(tablePath, "part" + fileNum); fs.mkdirs(tablePath); SequenceFile.Writer w = SequenceFile.createWriter(fs, conf, filePath, LongWritable.class, cls); // Now write the data. int startId = fileNum * numRecords; for (int i = 0; i < numRecords; i++) { record.parse(getRecordLine(startId + i)); w.append(new LongWritable(startId + i), record); } w.close(); } catch (ClassNotFoundException cnfe) { throw new IOException(cnfe); } catch (RecordParser.ParseError pe) { throw new IOException(pe); } }
@Override protected void map(LongWritable key, SqoopRecord val, Context context) throws IOException, InterruptedException { try { // Loading of LOBs was delayed until we have a Context. val.loadLargeObjects(lobLoader); } catch (SQLException sqlE) { throw new IOException(sqlE); } GenericRecord outKey = AvroUtil.toGenericRecord(val.getFieldMap(), schema, bigDecimalFormatString); wrapper.datum(outKey); context.write(wrapper, NullWritable.get()); }