Bienvenido a Java Mexico

Java México es una comunidad de desarrolladores mexicanos en el lenguaje Java.

Este sitio es colaborativo, automáticamente al registrarte obtienes un Blog para compartir tus conocimientos o información acerca del lenguaje. Antes de publicar en tu blog o los foros por favor lee los lineamientos de publicación.

Para dudas y problemas con respecto al lenguaje Java puedes visitar los Foros de Discusión.

También puedes responder nuestra encuesta para saber en que estado vives!

Ejemplo MapReduce Hadoop 5

Ya unicamente nos falta la clase main, para poder ejeutar nuestro ejemplo

Tambien es pequena asi que la pongo toda de una vez:

package mx.com.sinapsis.ds.test.ComparaPais;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class MaximaPoblacion extends Configured implements Tool {
       
        public static void main(String[] args)
                    throws Exception
                  {
                    ToolRunner.run(new Configuration(), new MaximaPoblacion(), args);
                  }

        @Override
        public int run(String[] args) throws Exception {
               
                args = new String[]{"input","output"};
               
                if (args.length != 2)
            {
              System.err.println("Usage: Max Poblacion <in> <out>");
              return 0;
            }
            setConf(new Configuration());
            Configuration conf = getConf();        

            Job job = new Job(conf, "compara pais");

Ejemplo MapReduce Hadoop 4

Ahora veremos la parte del reduce, el cual nos tiene que entregar el pais que tiene el numero maximo de pobladores.

En este caso sabemos ya que el map del anterior post manda a llamar al reduce por cada region existente, por lo que unicamente tenemos ahora que ubicar el pais que tiene la mayor poblacion.

El codigo es muy pequeño asi que no es necesario partirlo para explicarlo.

package mx.com.sinapsis.ds.test.ComparaPais;

import java.io.IOException;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MaximaPoblacionReducer extends
                Reducer<Text, Text, Text, Text> {
       
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{
                Long maxValue = Long.MIN_VALUE;
                String pais = "";
                //se obtiene el pais que tenga la mayor poblacion
                for(@SuppressWarnings("unused") Text value : values){
                        String[] valores = value.toString().split(":");                
                        if(!valores[0].equals("World")){                               
                                Long bMaxValue = Math.max(maxValue, Long.valueOf(valores[1]));
                                //Si es maximo que el anterior se guarda el pais que corresponde
                                if(bMaxValue > maxValue){

Ejemplo MapReduce Hadoop 3

Clase Map

Analizado el texto del cual obtendremos la informacion, vamos a crear la clase map la cual nos agrupara los paises por region, descartando todas las partes del texto que no sean necesarias.

En esta clase map lo que se va a hacer es identificar los paises y los datos necesarios por region:

 

  context.write(new Text(Pais.getRegion()), new Text(Pais.getNombre() + ":" +poblacion));

Se utiliza tambien patterns para identificar los datos necesarios:

 

  final static Pattern PAIS_PATTERN = Pattern.compile("[@][A-Z][a-z]*(,)?(\\s)?([A-Z][a-z]*)?(\\s)?([A-Z][a-z]*)?(\\s)?([A-Z][a-z]*)?(\\s)?([A-Z][a-z]*)?(\\s)?([A-Z][a-z]*)?[:][Geography]{9}");
 final static Pattern POBLACION_PATTERN = Pattern.compile("^\\s[Population]{10}[:]{1}\\s*");//Population: 65,780 (July 1995 est.)
 final static Pattern REGION_PATTERN = Pattern.compile("^\\s[Map]{3}\\s[references]{10}[:]*");// Map references: Africa
       

Se utiliza una clase plana para guardar los datos de pais

 

  Pais.nombre = pais;
 Pais.region = region;
       

debemos quitar los datos del mundo para que no se contabilice

 

Ejemplo MapReduce Hadoop 2

Comandos para cargar los datos en hdfs:

# Cargar en el HDFS
# Primero renombre los archivos con nombre corto
# CW para Datos estadisticos de la CIA 1995
$ mv pg571.txt CW.txt

# El siguiente comando falla si el directorio existe
$ hadoop fs -mkdir /user/cloudera

# Ahora ponga el texto en el directorio
$ hadoop fs -put CW.txt /user/cloudera

# Creamos alias de los comandos de hadoop
$ alias hput="hadoop fs -put"
$ alias hcat="hadoop fs -cat"
$ alias hls="hadoop fs -ls"
$ alias hrmr="hadoop fs -rm -r"

$ gzip CW.txt

# El punto hace referencia al directorio home de Cloudera
# en hdfs, /user/cloudera

$ hput DS.txt.gz .

# Verificar los archivos que existen ahora
$ hls
Found 4 items
drwx------ - cloudera cloudera 0 2014-04-10 16:03 .staging
-rw-r--r-- 3 cloudera cloudera 3013212 2014-04-21 14:28 CW.txt
drwxr-xr-x - cloudera cloudera 0 2014-04-10 16:03 HF.out
-rw-r--r-- 3 cloudera cloudera 605499 2014-04-10 15:25 HF.txt

Las parte clave en el documento que vamos a utilizar son:

Ejemplo MapReduce Hadoop 1

En el mundo actual los datos se han vuelto las estrellas, cuando uno prende la TV y enciende Netflix se da buena cuenta de esas posibilidades, rapidamente nos damos cuenta de que este sistema a averiguado cosas acerca de nuestras preferencias y en base a ellas nos brinda recomendaciones que en la mayoria de los casos son acertadas, esa es su mision conocer perfectamente nuestros gustos para tenernos mas tiempo sentados comodamente disfrutando de la programacion.

Si uno aparte lo utiliza para ver una de las series de casa como House Of Cards, la mayoria cae atrapado en la historia,fue echa tambien en base a el gusto de la mayoria de la poblacion, vamos la jugada es redonda.

Los programas que generalmente observamos, los que vemos pero luego de un rato abandonamos, a las escenas que nos aburren y le damos avanzar o las que rebobinamos, todo eso lo utiliza Netflix para generar la serie y cada capitulo.

Vamos pues a entrar un poco al mundo de BigData de la mano de la programacion MapReduce con el framework Hadoop(java), yo estoy tambien apenas aprendiendo asi que espero junto con varios lograr entender como hacer cosas como las señaladas en las lineas de introduccion.

Validar en Linux con shell CLASSPATH

Hace poco me vi en la necesidad de cambiar de infraestructura mis aplicaciones Java Standar Edition (Batch).
Me di cuenta que tengo que validar mis variables de ambiente entre ellas CLASSPATH, así que realice un shell que valida que tanto los directorios como los jar existan en mi nuevo servidor.

Les paso el fragmento de código.
Es para Linux usa bash y awk

echo $CLASSPATH: | awk '{n=split($0, arr, ":");for (i=1;i<n;i++){ print( "echo ",i, ".-",arr[i]); print ( "[ -f ",arr[i]," ] && echo Archivo Existe SI || echo Archivo Existe NO" ); print ( "[ -d ",arr[i]," ] && echo Directorio Existe SI || echo Directorio Existe NO" );  };  for (i=1;i<n;i++){print ( "echo ",i, " --------------------" ); print ("echo ls -ltr ", arr[i]); print( "ls -ltr ", arr[i] );} }' > rutasClassPath.sh
chmod +x rutasClassPath.sh
./rutasClassPath.sh > rutasClassPath.txt

Generando el PDF de un CFDI de nominas

Hace una semana me contactaron para el timbrado de unos CFDI's de nomina, por alguna razon me caen regularmente proyectos ya en el dead-line.

Como ya tenia la programacion para el timbrado con mi app .net, solo fue cosa de generar el sello y enviar a timbrar, el PAC con el que trabajo es ECODEX y creo que dan una buena solucion muy documentada con sus webservices, pero es otro tema.

Para la creacion del PDF, regularmente trabajo con iTextSharp o bien con Crystal Reports en Visual Studio 2010 (sorry x que se que no son temas de Java, pero iTextSharp afortunadamente tambien funca en Java).

Aunque el diseño en Crystal Reports en muy sencillo, como me pidieron que el recibo se repitiera en la misma hoja me atore un poco, asi que decidi irme por el camino que mas conozco para solucionarlo con iTextSharp.

Actualice mi version de IBM Lotus Symphony, que es freeware, cree un archivo de texto (ODT) que uso como plantilla y lo guarde como PDF, esto me permite generar los campos editables accesibles con programacion mediante los Acrofields del componente iTextSharp.

Leer XML de un CFDI para darle el tratamiento que quieras usando XMLBeans...

Recientemente se han timbrado los CFDI de nomina que generamos en la empresa...
en una entrada anterior a mi Blog expongo la solución para eso.... ahora para llevar un control interno de los mismos ocupamos meterlos a una BD, para lo cual la solución a la que YO llegué fue leer el contenido y depositarlo en la BD..

Expongo aquí lo siguiente.

/**
 *
 * @author RAMON.RANGEL
 */

public class AlmacenaCFDINomina {
   
   
    public AlmacenaCFDINomina() throws Exception{
       
    }
   
    public static void main(String args[]) throws XmlException, IOException, Exception{
    //public static void almacenarCFDI()throws XmlException, IOException, Exception{
        try{
       
        //Archivo XML a leer.
        String filePath="web/Humanos/Nomina/Talones/CFDI/XMLS/my-file.xml";
        File inputXmlFile=new File(filePath);
        Connection connection= ConnectionManager.getConnection();
        SQL query=new SQL(connection);
       
        //Datos exraidos del comprobante XML

Episodio 11 de la temporada 1 – Hector Zarate @iOSCowboy

Bienvenidos sean a otra emisión de su podcast favorito vivecodigo.org el episodio numero 11 de la temporada numero 1.

En esta ocasión una entrevista remota desde Varsovia con nuestro amigo Hector Zarate - @iOSCowboy, quien nos platica su interesante trayectoria profesional como desarrollador de software, el cual se desempeña en el desarrollo de aplicaciones móviles y que se encuentra escribiendo un libro titulado "Guia de referencia para el desarrollo y distribución de aplicaciones en plataformas móviles"

Nos habla sobre cuales son las claves del desarrollo de una aplicación móvil pero sobre todo cuales son las premisas para que una aplicación móvil sea exitosa:

  • Satisfacer una necesidad
  • Planear el desarrollo de software
  • Experiencia al usuario (usabilidad)
  • Marketing

Un tema muy interesante sobre el desarrollo para este tipo de plataformas.

Lo "nuevo" en Java 8: interfaces funcionales

En Lo nuevo en Java 8 describimos brevemente las expresiones lambda en esta nueva versión de Java. Es necesario asociar a esas expresiones un tipo para de esta manera satisfacer la comprobación de tipos que el lenguaje utiliza. La interfaces funcionales cumplen ese objetivo, además de poder ser usadas como siempre.
Una interfaz funcional es una interfaz que contiene un único método abstracto, además de algunos métodos implementados. Estos últimos se conocen como métodos de default o métodos de extensión virtual. Las interfaces también pueden contener funciones estáticas, aunque esto último nada tiene que ver con el adjetivo funcional que se les da.
Una expresión lambda encapsula una funcionalidad específica y parece "normal" asignarle a ellas un tipo dado por una interfaz que declara la firma de esa función.
Ya estamos acostumbrados a utilizar una interfaz con un solo método para precisamente manipular la funcionalidad de ese método y poder reutilizarlo. El ejemplo más común es el de las interfaces que definen los "event handlers" en Swing y otros APIs.

Distribuir contenido