Procesamiento y análisis de documentos JSON mediante Apache Hive en Azure HDInsight

Aprenda a procesar y analizar los archivos JavaScript Object Notation (JSON) con Apache Hive en Azure HDInsight. En este artículo se usa el siguiente documento JSON:

{
  "StudentId": "trgfg-5454-fdfdg-4346",
  "Grade": 7,
  "StudentDetails": [
    {
      "FirstName": "Peggy",
      "LastName": "Williams",
      "YearJoined": 2012
    }
  ],
  "StudentClassCollection": [
    {
      "ClassId": "89084343",
      "ClassParticipation": "Satisfied",
      "ClassParticipationRank": "High",
      "Score": 93,
      "PerformedActivity": false
    },
    {
      "ClassId": "78547522",
      "ClassParticipation": "NotSatisfied",
      "ClassParticipationRank": "None",
      "Score": 74,
      "PerformedActivity": false
    },
    {
      "ClassId": "78675563",
      "ClassParticipation": "Satisfied",
      "ClassParticipationRank": "Low",
      "Score": 83,
      "PerformedActivity": true
    }
  ]
}

El archivo se encuentra en wasb://processjson@hditutorialdata.blob.core.windows.net/. Para obtener más información sobre cómo usar Azure Blob Storage con HDInsight, consulte el artículo sobre el uso de Azure Blob Storage compatible con HDFS con Apache Hadoop en HDInsight. Puede copiar el archivo en el contenedor predeterminado del clúster.

En este artículo se usa la consola de Apache Hive. Para instrucciones sobre cómo abrir la consola de Hive, consulte Uso de Apache Ambari Hive View con Apache Hadoop en HDInsight.

Nota

Hive View ya no está disponible en HDInsight 4.0.

Acoplamiento de documentos JSON

Los métodos enumerados en la siguiente sección requieren que el documento JSON conste de una sola fila. Por lo tanto, debe acoplar el documento JSON en una cadena. Si el documento JSON ya está acoplado, puede omitir este paso e ir directamente a la sección siguiente sobre el análisis de los datos JSON. Para acoplar el documento JSON, ejecute el script siguiente:

DROP TABLE IF EXISTS StudentsRaw;
CREATE EXTERNAL TABLE StudentsRaw (textcol string) STORED AS TEXTFILE LOCATION "wasb://processjson@hditutorialdata.blob.core.windows.net/";

DROP TABLE IF EXISTS StudentsOneLine;
CREATE EXTERNAL TABLE StudentsOneLine
(
  json_body string
)
STORED AS TEXTFILE LOCATION '/json/students';

INSERT OVERWRITE TABLE StudentsOneLine
SELECT CONCAT_WS(' ',COLLECT_LIST(textcol)) AS singlelineJSON
      FROM (SELECT INPUT__FILE__NAME,BLOCK__OFFSET__INSIDE__FILE, textcol FROM StudentsRaw DISTRIBUTE BY INPUT__FILE__NAME SORT BY BLOCK__OFFSET__INSIDE__FILE) x
      GROUP BY INPUT__FILE__NAME;

SELECT * FROM StudentsOneLine

El archivo JSON sin formato se encuentra en wasb://processjson@hditutorialdata.blob.core.windows.net/. La tabla de Hive StudentsRaw apunta al documento JSON sin formato que no está acoplado.

La tabla de Hive StudentsOneLine almacena los datos en el sistema de archivos predeterminado de HDInsight en la ruta de acceso /json/students/ .

La instrucción INSERT rellena la tabla StudentOneLine con los datos de JSON acoplados.

La instrucción SELECT solo devuelve una fila.

Este es el resultado de la instrucción SELECT:

Acoplamiento de HDInsight del documento JSON.

Análisis de documentos JSON en Hive

Hive proporciona tres mecanismos distintos para ejecutar consultas en documentos JSON, pero también puede escribir las suyas propias:

  • Use la función definida por el usuario get_json_object.
  • Use la función definida por el usuario json-tuple.
  • Use el serializador/deserializador (SerDe) personalizado.
  • Escriba su propia función definida por el usuario con Python u otros lenguajes. Para más información sobre cómo ejecutar su propio código Python con Hive, consulte Funciones definidas por el usuario (UDF) de Python con Apache Hive y Apache Pig.

Uso de la función definida por el usuario get_json_object

Hive proporciona una función integrada definida por el usuario llamada get_json_object que consulta el código JSON en tiempo de ejecución. Este método toma dos argumentos: el nombre de la tabla y el nombre del método. El nombre del método tiene el documento JSON plano y el campo JSON que debe analizarse. Veamos un ejemplo para ver cómo funciona esta UDF.

La siguiente consulta devuelve el nombre y el apellido de cada estudiante:

SELECT
  GET_JSON_OBJECT(StudentsOneLine.json_body,'$.StudentDetails.FirstName'),
  GET_JSON_OBJECT(StudentsOneLine.json_body,'$.StudentDetails.LastName')
FROM StudentsOneLine;

Este es el resultado cuando se ejecuta esta consulta en la ventana de la consola:

Apache Hive obtiene la UDF de objeto JSON.

La función definida por el usuario get-json_object tiene algunas limitaciones:

  • Como cada campo de la consulta requiere volver a analizar la consulta, esto afecta al rendimiento.
  • GET_JSON_OBJECT() devuelve la representación de cadena de una matriz. Para convertir esta matriz en una de Hive, tiene que utilizar expresiones regulares para reemplazar los corchetes "[" y "]" y llamar también a split para obtener la matriz.

Esta conversión es el motivo por el que el sitio wiki de Hive recomienda json_tuple.

Uso de la función definida por el usuario json_tuple

Otra función definida por el usuario proporcionada por Hive se denomina json_tuple, que es más eficaz que get_ json _object. Este método toma un conjunto de claves y una cadena JSON. A continuación, devuelve una tupla de valores. La siguiente consulta devuelve el identificador y el curso del estudiante del documento JSON:

SELECT q1.StudentId, q1.Grade
FROM StudentsOneLine jt
LATERAL VIEW JSON_TUPLE(jt.json_body, 'StudentId', 'Grade') q1
  AS StudentId, Grade;

Salida de este script en la consola de Hive:

Resultados de la consulta JSON de Apache Hive

La función definida por el usuario json_tuple usa la sintaxis de lateral view de Hive, que permite que json_tuple cree una tabla virtual mediante la aplicación de la función de UDT a cada fila de la tabla original. Los JSON complejos se vuelven demasiado difíciles de manejar debido al uso repetido de LATERAL VIEW. Además, JSON_TUPLE no puede controlar los documentos JSON anidados.

Uso de un SerDe personalizado

Un SerDe es la mejor opción para analizar documentos JSON anidados. Le permite definir el esquema JSON y utilizarlo para analizar los documentos. Para instrucciones, consulte How to use a custom JSON SerDe with Microsoft Azure HDInsight (Uso de un SerDe personalizado para JSON con Microsoft Azure HDInsight).

Resumen

El tipo de operador JSON en Hive que elija depende de su escenario. Con un documento JSON simple y un campo para buscar, elija la UDF de Hive get_json_object. Si tiene varias claves por las que buscar, puede usar json_tuple. En el caso de los documentos anidados, use JSON SerDe.

Pasos siguientes

Para artículos relacionados, consulte: