code: public Optional<Bucket> getBucket(InputRow inputRow)
    {
      final Optional<Interval> timeBucket = schema.getDataSchema().getGranularitySpec().bucketInterval(
          DateTimes.utc(inputRow.getTimestampFromEpoch())
      );
      if (!timeBucket.isPresent()) {
        return Optional.absent();
      }
      final DateTime bucketStart = timeBucket.get().getStart();
      final ShardSpec actualSpec = shardSpecLookups.get(bucketStart.getMillis())
                                                   .getShardSpec(
                                                       rollupGran.bucketStart(inputRow.getTimestamp()).getMillis(),
                                                       inputRow
                                                   );
      final HadoopyShardSpec hadoopyShardSpec = hadoopShardSpecLookup.get(bucketStart.getMillis()).get(actualSpec);
  
      return Optional.of(
          new Bucket(
              hadoopyShardSpec.getShardNum(),
              bucketStart,
              actualSpec.getPartitionNum()
          )
      );
  
    }
docs: Get the proper bucket for some input row.
  
  @param inputRow an InputRow
  
  @return the Bucket that this row belongs to