@Override
 public int getPartition(
     LongWritable longWritable, BytesWritable bytesWritable, int numPartitions) {
   if (start == null) {
     initialize();
   }
   long x = longWritable.get();
   int ret = (int) Long.divideUnsigned(x - start, width);
   return ret;
 }
 public <T> List<byte[]> query(
     Path basePath,
     Path baseOutputPath,
     long beginNS,
     long endNS,
     int numReducers,
     T fields,
     Configuration conf,
     FileSystem fs,
     PcapFilterConfigurator<T> filterImpl)
     throws IOException, ClassNotFoundException, InterruptedException {
   String fileName =
       Joiner.on("_")
           .join(beginNS, endNS, filterImpl.queryToString(fields), UUID.randomUUID().toString());
   if (LOG.isDebugEnabled()) {
     DateFormat format =
         SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.LONG);
     String from = format.format(new Date(Long.divideUnsigned(beginNS, 1000000)));
     String to = format.format(new Date(Long.divideUnsigned(endNS, 1000000)));
     LOG.debug(
         "Executing query "
             + filterImpl.queryToString(fields)
             + " on timerange "
             + from
             + " to "
             + to);
   }
   Path outputPath = new Path(baseOutputPath, fileName);
   Job job =
       createJob(basePath, outputPath, beginNS, endNS, numReducers, fields, conf, fs, filterImpl);
   boolean completed = job.waitForCompletion(true);
   if (completed) {
     return readResults(outputPath, conf, fs);
   } else {
     throw new RuntimeException(
         "Unable to complete query due to errors.  Please check logs for full errors.");
   }
 }
 public static int findWidth(long start, long end, int numReducers) {
   return (int) Long.divideUnsigned(end - start, numReducers) + 1;
 }