Trabajando con Hive y JSON

En muchos escenarios de trabajo partiré de unos datos en formato JSON que quiero volcar directamente en mi infraestructura Hadoop para posteriormente hacer procesamiento con ellos.

Existen 2 formas de trabajar con estructuras JSON a través de HIVE, veámoslas con un ejemplo:

Supongamos una estructura de datos como esta:

A través de la función get_json_object:

En este caso crearemos una tabla con un campo de tipo STRING y sobre este aplicaremos las funciones:

1. Cargo fichero comments en HDFS cmd>hadoop fs -put comments comments

2. Creamos Tabla: hive>CREATE TABLE comment_data(comment_val STRING);

3. Cargamos datos de fichero HDFS: hive>LOAD DATA INPATH ‘/user/training/comments’ OVERWRITE INTO TABLE comment_data;

4. Realizo query básica:

hive>SELECT * from comment_data LIMIT 5;

5. Realizo query usando function get_json_object:

hive>select get_json_object(comment_data.comment_val, ‘$.commenterId’), get_json_object(comment_data.comment_val, ‘$.commentData’) from comment_data;

6. Consulta algo más compleja:

Hive> SELECT b.commentData,COUNT(b.commentData)

FROM comment_data a LATERAL VIEW json_tuple(a.comment_val, ‘commentData’) b

AS commentData where b.commentData LIKE ‘%cave%’ GROUP BY b.commentData;

Usando el serializador hive-json-serde

Con esta opción podemos cargar los atributos JSON en columnas individuales.

1. Cargo fichero comments en HDFS cmd>hadoop fs -put comments comments2

2. Registramos el JAR del Serializador: hive>ADD JAR /mnt/hgfs/shared/hive-json-serde-0.2.jar;

3. Creamos tabla que corresponda con estructura de mi JSON:

hive>CREATE TABLE comment_data_split(commenterId STRING, commentData STRING, country STRING) ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.JsonSerde’;

7. Cargo datos a la tabla hive>LOAD DATA INPATH ‘/user/training/comments2’ OVERWRITE INTO TABLE comment_data_split;

4. Realizo consultas (en este caso la query es mucho más sencilla):

Hive>select a.commenterId, a.commentData, count(a.commentData) from comment_data_split a where a.commentData like ‘%cave%’ group by a.commenterId, a.commentData;

Esta opción es mucho más recommendable aunque require conocer previamente la estructura de los ficheros JSON a cargar a la hora de crear la tabla.

Deja un comentario