Existen diferentes anotaciones que podemos utilizar en nuestras entidades para dar formato a los valores de sus propiedades. En esta ocasión, hablaremos de las anotaciones @Type, @JsonFormat y @Temporal.



  • @Type: con esta anotación podemos cambiar el tipo de dato que viene de base de datos y convertirlo en otro tipo de dato. Como ejemplo, hemos añadido la propiedad ebook anotada en nuestra entidad Libro, con el fin de conocer si es un libro electrónico o no. En base de datos hemos utilizado una columna de tipo SMALLINT para representar valores boolean (0 y 1). Sin embargo, la propiedad en la entidad es de tipo boolean. Para realizar esta conversión de número a boolean tenemos que utilizar la anotación @Type especificando el tipo de conversión, que en este caso es org.hibernate.type.NumericBooleanType, tal y como se muestra en la línea 34. 
  • @JsonFormat: esta anotación permite formatear el valor de una propiedad en el momento de serialización de los datos. Hemos utilizado esta anotación para dar formato a la propiedad timestampInsercion, que indica la fecha de inserción de un libro en base de datos. Así, cuando obtenemos el JSON de un libro, la propiedad timestampInsercion se formateará siguiendo el patrón y el horario GMT especificado, tal y como se puede apreciar en la línea 38. 
  • @Temporal: sirve para especificar la precisión temporal de una propiedad de tipo Date. De esta forma, puede ser de tipo TIMESTAMP, TIME o DATE. En el ejemplo de la línea 39, hemos especificado una precisión de tipo TIMESTAMP, ya que es lo que almacenaremos en base de datos.


Pulsa aquí para acceder al código de esta entrada en mi repositorio Github
Spark dispone de un módulo para el procesamiento de consultas SQL. Estas consultas pueden utilizarse para manipular datos estructurados de lo más variado (JSON, CSV, Parquet, etc.) y sobre multitud de repositorios (bases de datos relacionales y no relacionales, Amazon S3, Hadoop, etc.). Además, es compatible con HiveQL, un lenguaje similar al conocido SQL que se ha convertido en indispensable a la hora de realizar operaciones sobre grandes cantidades de datos en plataformas Hadoop.



En este ejemplo, veremos cómo realizar consultas SQL sobre documentos en formato JSON. Para ello puedes descargar el fichero personas.json, donde en cada línea encontrarás la representación de una entidad Persona con los atributos nombre, edad y género. Es importante recalcar que en cada línea se encuentra una única representación de la entidad Persona en JSON, ya que de lo contrario el fichero no podría ser procesado por Spark. Debes copiar este fichero en "C:", para poder hacer referencia al mismo en el código del programa (línea 19) que leerá las personas contenidas en dicho fichero.

Para tener acceso al fichero y poder realizar las consultas, se crea un HiveContext. Esta clase dispone de métodos para leer archivos de diferentes tipos, en este caso JSON. Se puede especificar un fichero o un directorio que contiene ficheros JSON. En  nuestro caso será un único fichero. La lectura de este fichero devuelve una estructura de tipo DataFrame. Este tipo de dato es similar al utilizado en R y viene a representar los datos como si de una tabla de base de datos se tratara. El esquema de los datos y su tipología se infieren automáticamente por Spark, aunque para ganar en eficiencia pueden ser especificados de forma manual.

Una vez que tenemos el DataFrame, se creará una tabla temporal cacheada (líneas 22 y 23) sobre la que poder lanzar las consultas SQL. Una primera consulta obtiene todas las personas del fichero, y una segunda obtiene el número de personas del fichero. Los datos se devuelven en una estructura de tipo DataFrame.

A continuación hemos utilizado un método de agregación proporcionado por el DataFrame. Este método devuelve el máximo, mínimo y número de personas en un DataFrame.



Podemos visualizar los resultados con la función show() que dibujará por consola los DataFrame.



Pulsa aquí para acceder al código de esta entrada en mi repositorio GitHub