Importante | mr usa hcatalog para leer y escribir tablas de colmena

Importante | mr usa hcatalog para leer y escribir tablas de colmena

Hablando de big data

Este artículo habla principalmente sobre mapreduce usando HCatalog para leer y escribir tablas de colmena.

hcatalog hace que los metadatos de hive puedan ser utilizados por otras herramientas de hadoop, como pig, mr y hive.

Las tablas de HCatalog brindan a los usuarios una vista relacional de los datos en (HDFS) y aseguran que los usuarios no tengan que preocuparse por dónde se almacenan sus datos o en qué formato, por lo que los usuarios no necesitan saber si los datos están almacenados en RCFile formato, archivo de texto o archivo de secuencia.

También proporciona servicios de notificación para notificar a las herramientas de flujo de trabajo (como Oozie) cuando hay nuevos datos disponibles en el almacén.

HCatalog proporciona HCatInputFormat / HCatOutputFormat para permitir a los usuarios de MapReduce leer / escribir datos en el almacén de datos de Hive. Permite a los usuarios leer solo las particiones de las tablas y columnas que necesitan. El formato de registro devuelto es un formato de lista conveniente y el usuario no necesita analizarlos.

A continuación damos un ejemplo sencillo.

En la clase del asignador, obtenemos el esquema de la tabla y usamos esta información de esquema para obtener las columnas requeridas y sus valores.

A continuación se muestra la clase de mapa.


public class onTimeMapper extends Mapper {
   @Override
   protected void map(WritableComparable key, HCatRecord value,
    org.apache.hadoop.mapreduce.Mapper.Context context)
    throws IOException, InterruptedException {

    // Get table schema
    HCatSchema schema = HCatBaseInputFormat.getTableSchema(context);

    Integer year = new Integer(value.getString("year", schema));
    Integer month = new Integer(value.getString("month", schema));
    Integer DayofMonth = value.getInteger("dayofmonth", schema);

    context.write(new IntPair(year, month), new IntWritable(DayofMonth));
   }
}

En la clase reducida, se crea un esquema para que los datos se escriban en la tabla de colmena.


public class onTimeReducer extends Reducer {
public void reduce (IntPair key, Iterable value, Context context) 
 throws IOException, InterruptedException{

 int count = 0; // records counter for particular year-month
 for (IntWritable s:value) {
  count++;
 }

 // define output record schema
 List columns = new ArrayList(3);
 columns.add(new HCatFieldSchema("year", HCatFieldSchema.Type.INT, ""));
 columns.add(new HCatFieldSchema("month", HCatFieldSchema.Type.INT, ""));
 columns.add(new HCatFieldSchema("flightCount", HCatFieldSchema.Type.INT,""));
 HCatSchema schema = new HCatSchema(columns);
 HCatRecord record = new DefaultHCatRecord(3);

 record.setInteger("year", schema, key.getFirstInt()); 
 record.set("month", schema, key.getSecondInt());
 record.set("flightCount", schema, count);
 context.write(null, record);
}
}

Finalmente, cree la clase de controlador e indique el esquema de entrada y salida y la información de la tabla.


public class onTimeDriver extends Configured implements Tool{
   private static final Log log = LogFactory.getLog( onTimeDriver.class );

   public int run( String[] args ) throws Exception{
    Configuration conf = new Configuration();
    Job job = new Job(conf, "OnTimeCount");
    job.setJarByClass(onTimeDriver.class);
    job.setMapperClass(onTimeMapper.class);
    job.setReducerClass(onTimeReducer.class);

    HCatInputFormat.setInput(job, "airline", "ontimeperf");
    job.setInputFormatClass(HCatInputFormat.class);
    job.setMapOutputKeyClass(IntPair.class);
    job.setMapOutputValueClass(IntWritable.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(DefaultHCatRecord.class);
    job.setOutputFormatClass(HCatOutputFormat.class);
    HCatOutputFormat.setOutput(job, OutputJobInfo.create("airline", "flight_count", null));
    HCatSchema s = HCatOutputFormat.getTableSchema(job);
    HCatOutputFormat.setSchema(job, s);

    return (job.waitForCompletion(true)? 0:1);
   }

   public static void main(String[] args) throws Exception{
 int exitCode = ToolRunner.run(new onTimeDriver(), args);
 System.exit(exitCode);
}
}

Por supuesto, antes de ejecutar el código escrito anteriormente, debe crear una tabla de salida en Hive.


create table airline.flight_count
(Year INT ,
Month INT ,
flightCount INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE;

El lugar que puede causar un error es que $ HIVE_HOME no está configurado.
[Fin]

Supongo que te gusta

Origin blog.51cto.com/15127544/2664767
Recomendado
Clasificación