Estadística simple con Spark V2

Sigo con mi pruebas con lo nuevo (y no tan nuevo de Spark 2), hoy comparto con ustedes una versión 2 de mi anterior post Estadística simple con Spark, pero en esta ocasión realizado con Spark 2.

¿Que tiene de nuevo esta versión?

Primeramente utiliza el módulo spark-csv lo cual nos hace más simple la carga del fichero en un Dataset. Segundo, que no manipulamos en ningún instante RDD alguno, sino que por el contrario estamos trabajando con DataFrames representados mediante la clase Dataset. Entre las cosas nuevas que contempla esta versión hecha en Spark 2 es que mientras antes al realizar un groupBy sobre un DataFrame esto nos devolvía un GroupedData ahora nos devuelve un RelationalGroupedData, esto debido a un cambio de nombre que se le ha dado a partir de esta nueva versión de Spark.

Esta nueva versión realizada con SparkSQL con Datasets tiene varias ventajas, la primera es simplicidad, es mucho mas simple, mas fácil de entender el código además de mas corto, de hecho con menos lineas obtuve más información que con la versión elaborada con RDD’s, es decir, es mas versátil. Por otro lado aunque hay que tener algo de nociones de conjuntos lo interesante es que esta versión esta libre de código SQL.

Sin más dilación he aquí el código y el enlace al proyecto en Github.

Para que comparen los resultados obtenidos aquí con respecto a la entrada anterior dejo un pantallazo de lo obtenido al ejecutarlo en mi local.

promedios por distrito

promedios por distrito

Otras agregaciones por distrito

Otras agregaciones por distrito

Total personas por distrito

Total personas por distrito

Primeros pasos con Apache Spark 2

Hace pocos días salió la esperada versión 2 de Apache Spark y como algunos de ustedes saben es un framework que ahora mismo atrae mucho mi atención y como no pudo ser de otra forma hice un pequeño proyecto donde quiero ir colocando ejemplos sencillos de Spark con las nuevas (y no tan nuevas) cosas de Spark.

Para empezar comentarles que yo todavía no he utilizado sbt sino por el contrario uso maven como herramienta de construcción de proyectos. He aquí los primeros cambios necesarios para trabajar con spark 2, las dependencias correspondientes a la versión (indicadas en el pom.xml).

Entre los nuevos cambios de spark está que el punto de entrada para los programas spark ya no serán el hiveContext o sqlContext sino que han sido subsumidas en una clase llamada SparkSession. Las clases HiveContext y SQLContext se han mantenido para proporcionar retrocompatibilidad. Ejemplo

Con el SparkSession haremos lo mismo que hacíamos con sqlContext por ejemplo obtener un Dataset

O por el contrario obtener un DataFrame

Otro punto importante ha sido la unificación de las clases Dataset y DataFrame (para Java y Scala) a partir de la versión 2.¿Qué significa esto? pues sencillamente que ahora solo existirá la clase Dataset, pero proporcionará la misma funcionalidad que nos daba la clase DataFrame, de hecho basta con comparar la API en la versión 1.6.2 y 2.0.0 y ver como los métodos de la clase DataFrame están ahora incluidos en la clase Dataset.

Dataset y Dataframe en Spark 2

Dataset y Dataframe en Spark 2

Aquellos interesados en leer más acerca de Dataset y Dataframe  visitar este link

Estos no son los únicos cambios en Spark, de hechos son muchos más, que se corresponden a optimizaciones a nivel de compilación y ejecución así como también a un nuevo parseador SQL, para leer mas acerca de lo nuevo en Spark 2 clic aquí.

Aqui les dejo en enlace al proyecto donde ire añadiendo clases y seguiré probando mas cosas nuevas de Spark.

¿Valen la pena las certificaciones?

Tiempo atrás me hicieron la siguiente consulta en el blog:

«Hola Jose,

estoy muy indecisa en si prepararme para la certificación de Java. Mucha gente me dice que es absurdo porque las preguntas son del api, y tipo trozos de código que tienes que hacer de compilador y que al final se vuelve en un absurdo porque eso al fin y al cabo en nuestro día a día con un compilador es intuitivo. También me han dicho que a la hora del mundo laboral apenas lo valoran porque como debemos pagar para certificarnos, como que los empresarios lo ven como un título comprado.«

Antes que nada disculparme con la persona que me escribió ya que ha pasado algo de tiempo y apenas ahora es que le respondo, pero aquí voy y con la sinceridad que me caracteriza.

En más de una vez he recalcado estar a favor en realizar certificaciones, pero así como lo he dicho alguna vez, ahora lo repito, «no es por el papel», el papel o el certificado es lo de menos, bueno (pausa de 1 seg), es un premio o mejor dicho un reconocimiento al esfuerzo y a la dedicación que has puesto en estudiar y aprender cierta tecnología o idioma, es como cuando presentábamos un examen importante (para obtener créditos especiales o en una materia electiva de particular importancia) y después de tanto estudiar te otorgaban un aprobado pero que goza de cierto cache, ya que no se aprueba con la mitad de la nota sino con un poco más (por ejemplo si las notas van de 1 a 10 se otorgue únicamente el aprobado con 6.5). Lo que a mí particularmente me parece fascinante de las certificaciones y me entusiasma a realizarlas es todo el proceso de preparación, es como te planteas y organizas los objetivos para estudiarlos, como al cabo de un tiempo empiezas a darte cuenta de que algunos temas los tienes bien cubiertos mientras que hay otros donde necesitas hacer énfasis y repasarlos de nuevo, todo ese proceso de estudio con ese poquitín de presión añadida pero sobretodo con la ambición de aprender y mejorar tus habilidades profesionales, creo que hace méritos más que suficientes para presentar una certificación, y voy a plantear par de ejemplos para intentar hacerles llegar mi punto de vista.

Imaginemonos que empezamos a prepararnos durante algunos meses en presentar un examen de inglés, por ejemplo el FCE (también llamado el first). Si nos hemos esforzado digamos que durante unos 5 meses estudiando, leyendo muchos verbos, conjungandolos y utilizándolos en frases, escuchando mucho inglés, etc… ya habremos ganado, porque independientemente de que al presentar aprobemos o no el examen, el premio lo recibiremos cuando nos toque hablar con una persona de habla inglesa y hayamos podido entender a esta persona y a su vez hayamos logrado expresarnos con cierta fluidez, que si no fue tal, pues sencillamente no importa porque estoy seguro de que nos expresaríamos mucho mejor que antes de haber empezado a estudiar para la certificación.

Otra razón de presentar las certificaciones, es el saber, porque para mí «el saber es poder», el saber te da confianza, y si vas a presentarte para una entrevista de trabajo o para un cargo, créeme que la confianza es importante (te desenvuelves mejor, yo sinceramente creo que hasta te cambia la cara y hasta la forma de expresarte) y ahora bien ¿recuerdas cuando en la escuela tenías que hacer una exposición? a la mayoría nos daba algo de miedo escénico, pero había una cosa que siempre era palpable independientemente de que fueras el mejor en el escenario o no, y es que siempre se sabía quien había estudiado y quien no. ¿Crees que las personas de RRHH no se dan cuenta? y si tuviste suerte y pasaste esa entrevista recuerda que luego seguramente tendrás una entrevista técnica y a esta persona será difícil que le engañes o mejor dicho dejaras mejor imagen si le demuestras a esa persona que sabes de lo que hablas.

Entonces, ¿valen la pena las certificaciones? SI

¿Los empresarios lo ven como un titulo comprado? No conozco ninguno que lo vea de esa manera y en dado caso desde mi humilde punto de vista te diría corre y vete de esa empresa porque allí no te valorarán ni como profesional ni tu deseo de ser mejor.

Yo particularmente he visto como últimamente empresas dedican una «bolsa» de dinero para fomentar la certificación de sus empleados, ya que a la hora de escoger un perfil entre un grupo de candidatos, la certificación y el haber aprobado la entrevista técnica puede que pongan la balanza a tu favor. Además no olvidemos que las empresas son las principales beneficiadas de que nosotros los empleados nos certifiquemos, ya que a priori están ganando, teniendo en el staff mejores profesionales.

¿Algunas preguntas son muy complejas y debemos actuar como si fuésemos un compilador, ya que incluyen código? Si hay preguntas que incluyen código y debemos actuar como un compilador pero ni son muchas y tampoco todas son extremadamente difíciles, estas la mayoría de las veces son conchas de mango, que si has estudiado, las vas a pillar de inmediato.

Así que amiga no lo pienses 2 veces certificate si tienes interés en hacerlo, que en el peor de los casos lo que harás es aprender 😉 y serás bien valorada por el gremio profesional y por tus colegas por interesante en afrontar retos de este tipo.

Por último confesar que ya he empezado a preparar mi próxima certificación y como adelanto les dire que va enfocada en tecnologías Big Data.

PD: La de Java 8 me hace mucho ojito, jejejeje, pero ya he estudiado por mi parte las expresiones lambda, los streams, los default methods de las interfaces, entre otras cosas, por lo cual no siento tanto interés como otras veces en presentarla, así que quizás cuando salga Java 9 me meta de cabeza a estudiar de nuevo.

Primer ejemplo con apache Storm

Apache Storm es un framework de procesamiento distribuido de eventos. Empresas como twitter utilizaron Storm desde el 2011 aunque posteriormente lo reemplazó por Heron en el 2015.

Actualmente me encuentro trabajando en una aplicación construida con Apache Storm y quiero compartir con ustedes mi primer ejemplo con Apache Storm el cual es bastante simple pero cumplio su cometido que era el iniciarme en este framework y entender sus componentes principales.

Necesitaremos descargar rabbitMQ la versión 3.5.7.

Una vez hayamos instalado rabbitMQ (es solo cuestión de descomprimir) vamos a habilitar un plugin (un cliente web) donde podremos de forma sencilla monitorizar las colas, entonces nos ubicamos en la siguiente ruta ruta_instalacion_rabbitmq/sbin/ y desde allí ejecutamos el siguiente comando

./rabbitmq-plugins enable rabbitmq_management

Este comando habilitará el cliente web que nos permitirá monitorizar las colas, los exchanges  incluso manipular las colas pudiendo ingresar elementos a las colas, sacar elementos e incluso purgar las colas. Paso siguiente iniciaremos el rabbitMQ con el siguiente comando:

./rabbitmq-server

Inmediatamente después desde un navegador nos dirigimos a la dirección http://localhost:15672

rabbitmq overview

rabbitmq overview

Una vez allí crearemos una cola para hacer nuestro ejemplo y la llamaremos «data».

agregar cola en rabbitmq

agregar cola en rabbitmq

Ahora deberíamos ser capaces de ver la única cola de nuestro sistema. Clicando en ella podríamos incluso agregarle mensajes por medio de la interfaz gráfica (si lo desean hagan la prueba y verán como cada uno de los mensajes que agreguen se irán encolando), pero la inserción de mensajes en la cola lo haremos mediante un pequeño programa Java.

cola data

cola data

Ahora un poco de teoría para conocer acerca de Apache Storm.

¿Qué es Apache Storm?

Es un framework de computación distribuida en tiempo real, escrito en su mayoría en Clojure. Storm es similar a la forma como Hadoop ofrece un conjunto de primitivas generales para hacer el procesamiento por lotes, también ofrece un conjunto de primitivas generales para hacer cómputos en tiempo real. Storm es simple, se puede utilizar con cualquier lenguaje de programación.

Las aplicaciones de Storm son creadas como topologías en la forma de DAG (Directed Acyclic  Graph) con spouts y bolts actuando como los vertices del grado. Las aristas en el grafo son llamados streams y dirigen la data de un nodo a otro. Juntos, la topología actúa como una tubería de transformación de datos.

Los spouts son fuentes de flujo (streams) en una topología. Los spouts generalmente leerán tuplas desde una fuente externa y las emiten dentro de la topología.

Un bolt es donde se realiza todo el procesamiento de una topología, pueden hacer cualquier cosa, desde filtrado, funciones, agregaciones, joins, comunicarse con bases de datos y mucho más.

El ejemplo que hice y compartiré a continuación con ustedes será bastante simple, estará constituido por un spout que leerá de una cola rabbitmq (la cola data que creamos anteriormente) y ese mensaje lo insertará en la topología para posteriormente al recibirlo el bolt mostrarlo por linea de comandos (ya luego si ustedes lo desean lo que podrían hacer es que en vez de mostrarlo por linea de comandos volcar ese mensaje en otra cola de rabbitmq).

El programa java que se encarga de insertar mensajes a la cola

El Spout que leerá de la cola rabbitMQ

El bolt que leerá los datos que han sido insertados en la topología por el Spout

Definición de la topología

Para ejecutar nuestro ejemplo y verlo funcionando debemos ejecutar 2 clases (el orden sería indistinto):

  • SendMessagesToRabbit
  • RabbitMQTopologyExample

Al ejecutar la clase SendMessagesToRabbit, podremos ver en el cliente Web de RabbitMQ como la cola tendrá 10000 mensajes encolados. Al ejecutar la topología (ejecutando la clase RabbitMQTopologyExample) podremos ver como los mensajes se van desencolando y a su vez por linea de comandos (por ejemplo de nuestro editor) veremos los mensajes que en teoría el bolt leyó y procesó.

Espero que les sea de utilidad y disfruten con este framework, desde mi punto de vista es sencillo y funciona bien, incluso la nueva herramienta que utiliza Twitter posee retrocompatibilidad con Storm por lo cual se podría empezar con un ejemplo de este tipo.

Clic aquí para ir al repositorio github.

Web scraping con Java

Actualmente me encuentro desarrollando mi proyecto final de máster, el cual consiste en crear un modelo de aprendizaje automático que arroje predicciones acerca de partidos de futbol de la liga de primera división española. Para ello he necesitado entre otras cosas tener los resultados de todas las jornadas de las ultimas ligas. Aunque recientemente conseguí un paquete de R (enlace) que contenía los resultados desde 1929, este no me proporcionaba toda la información que yo buscaba, así que me decidí por obtener yo mismo esa información sacándola de las paginas deportivas y es lo que quiero compartir con ustedes.

En un principio pense en hacerlo en python con la biblioteca lxml, pero haciendo una búsqueda rápida por Internet encontré un proyecto en Java llamado Jsoup y debo decir que este si me simplifico la tarea.

Primero como todos saben es necesario que demos un repaso a la estructura del documento que vamos a scrapear y confirmar que hay un patron.

estructura documento html

Como pueden ver en la imagen, podemos detallar que todas las filas de las tablas de las jornadas comparten el atributo itemtype=»http://schema.org/SportEvent», así que este fue el que utilicé para obtener todas las filas y a partir de allí obtener los nombres de los equipos, el resultado y el enlace para ir al detalle del partido.

Par de cosas que quisiera comentar con respecto al código:

  • Podemos aplicar expresiones sobre elementos de antemano obtenidos, por ejemplo como se hizo para obtener los equipos que intervienen en el partido.
  • Existe otra forma además de la anteriormente explicada (usando expresiones) para obtener elementos del árbol DOM de la página Web, si damos un vistazo a la API de la biblioteca del partido, existe un método getElementsByAttributeValue, entonces para obtener el elemento score, este se pudo haber obtenido también de la siguiente manera

    Elements score = match.getElementsByAttributeValue(«class», «resultado resul_post»)

  • Por último si quisiéramos obtener mas datos por ejemplo del detalle del partido (ya que logramos obtener el url), esta biblioteca nos permite seguir navegando (haciendo conexiones), y sería cuestión de realizar otra conexión y de nuevo empezar a extraer elementos.
    Document detalleDelPartido = Jsoup.connect(statsLink).get()

Aquí les dejo el enlace al repositorio GitHub y espero que les pueda ser de utilidad.