package org.apache.hadoop.hive.kafka.camus; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; import org.apache.hadoop.mapred.FileSplit; import org.apache.hadoop.mapred.InputSplit; public class KafkaSplit extends FileSplit { private List<CamusRequest> requests = new ArrayList<CamusRequest>(); private long length = 0; private String currentTopic = ""; private Path path; public KafkaSplit() { // TODO: Passing single spaced path " " is not the best way. // need to figure out better ways of handling this. // path is properly initialized when readFields is called this(new Path(" ")); } public KafkaSplit(Path path) { super(path, 0, 0, (String[]) null); this.path = path; } @Override public void readFields(DataInput in) throws IOException { path = new Path(Text.readString(in)); int size = in.readInt(); for (int i = 0; i < size; i++) { CamusRequest r = new KafkaRequest(); r.readFields(in); requests.add(r); length += r.estimateDataSize(); } } @Override public void write(DataOutput out) throws IOException { Text.writeString(out, path.toString()); out.writeInt(requests.size()); for (CamusRequest r : requests) r.write(out); } @Override public long getLength() { return length; } public int getNumRequests() { return requests.size(); } @Override public String[] getLocations() throws IOException { return new String[] {}; } public void addRequest(CamusRequest request) { requests.add(request); length += request.estimateDataSize(); } public CamusRequest popRequest() { if (requests.size() > 0){ for (int i = 0; i < requests.size(); i++) { // return all request for each topic before returning another topic if (requests.get(i).getTopic().equals(currentTopic)) return requests.remove(i); } CamusRequest cr = requests.remove(requests.size() - 1); currentTopic = cr.getTopic(); return cr; } else return null; } @Override public Path getPath() { return path; } }