Crear un SequenceFile
Crearemos un SequenceFile de un texto, que es un poema, y le pondremos como key el número correspondiente a cada línea.
public class CreateSequenceFile { private static final String[] POEMA = { "El ciego sol se estrella", "en las duras aristas de las armas,", "llaga de luz los petos y espaldares", "y flamea en las puntas de las lanzas.", "El ciego sol, la sed y la fatiga", "Por la terrible estepa castellana,", "al destierro, con doce de los suyos", "-polvo, sudor y hierro- el Cid cabalga.", "Cerrado está el mesón a piedra y lodo.", "Nadie responde... Al pomo de la espada", "y al cuento de las picas el postigo", "va a ceder ¡Quema el sol, el aire abrasa!"}; private static final String rutaDestino
= new String ("pruebas/poemasequencefile");
public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); FileSystem fs = FileSystem.get( conf); Path path = new Path(rutaDestino); IntWritable key = new IntWritable(); Text value = new Text(); //Creamos el writer del SequenceFile para poder ir añadiendo // los pares key/value al fichero. SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf, path, key.getClass(), value.getClass()); for (int i = 0; i < POEMA.length; i++) { // La key es el número de línea key.set(i+1); // El value es la línea del poema correspondiente value.set(POEMA[i]); // Escribimos el par en el sequenceFile writer.append(key, value); } writer.close(); } }
Leer un SequenceFile
En este ejemplo no sólo vamos a leer el fichero creado anteriormente, sino que también vamos a buscar y a usar los puntos de sincronización, vamos a ver las posiciones del fichero y vamos a desplazarnos a alguna.
public class ReadSequenceFile { private static final String rutaOrigen
= new String ("pruebas/poemasequencefile");
public static void main(String[] args)
throws Exception {
Configuration conf = new Configuration(); FileSystem fs = FileSystem.get( conf); Path path = new Path(rutaOrigen); //Creamos el Reader del SequenceFile SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf); // Leemos la key y value del SequenceFile, los tipos son conocidos, // por lo que se declaran variables de esos tipos. IntWritable key = (IntWritable) reader.getKeyClass().newInstance(); Text value = (Text) reader.getValueClass().newInstance(); StringBuilder strBuilder; boolean haySync = false; long posSync = 0; //Recorremos el reader recuperando los pares key/value while(reader.next(key,value)){ // Comprobamos si la posición es un punto de sync // En principio en este fichero no encontrará ninguno ya que es muy // pequeño, si fuera uno más grande y tuviera varios puntos de sync // se guardará el último punto encontrado. if(reader.syncSeen()){ haySync = true; posSync = reader.getPosition(); } strBuilder = new StringBuilder("Posición: "). append(reader.getPosition()).append(" - Key: "). append(key.toString()).append(" Value: " ). append(value.toString()); System.out.println(strBuilder); } if(haySync){ // reader.sync posicionará el reader en el sync siguiente más próximo, // si no hay ninguno se posicionará al final del fichero. // En este caso se posicionará en el punto dado, ya que es de sync. strBuilder = new StringBuilder("Sync en el punto: "). append(posSync); System.out.println(strBuilder); reader.sync(posSync); }else{ // Es un valor conocido, si no existiera, habría un error // al realizar el reader.next. posSync = 459; reader.seek(posSync); } // En un caso o en otro a pesar de haber finalizado la iteración // hemos posicionado el reader en un punto intermedio, así que // seguimos recorriéndolo (repetimos las líneas) // hasta finalizar de nuevo. strBuilder = new StringBuilder("Volvemos a la posición: ") .append(posSync); System.out.println(strBuilder); System.out.println("Seguimos recorriendo el reader: "); while(reader.next(key,value)){ strBuilder = new StringBuilder("Posición: "). append(reader.getPosition()).append(" - Key: "). append(key.toString()).append(" Value: " ). append(value.toString()); System.out.println(strBuilder); } reader.close(); } }