Elaborare e analizzare documenti JSON tramite apache Hive in HDInsight di Azure

Informazioni su come elaborare e analizzare i file JavaScript Object Notation (JSON) tramite Apache Hive in HDInsight di Azure. Questo articolo usa il documento JSON seguente:

{
  "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
    }
  ]
}

Il file è disponibile in wasb://processjson@hditutorialdata.blob.core.windows.net/. Per altre informazioni su come usare l'archivio BLOB di Azure con HDInsight, vedere Usare un archivio BLOB di Azure compatibile con Hadoop Distributed File System con Apache Hadoop in HDInsight. È possibile copiare il file nel contenitore predefinito del cluster.

In questo articolo si usa la console Apache Hive. Per istruzioni su come aprire la console Hive, vedere Usare la vista Hive di Apache Ambari con Apache Hadoop in HDInsight.

Nota

La vista Hive non è più disponibile in HDInsight 4.0.

Rendere flat i documenti JSON

I metodi elencati nella sezione successiva richiedono che il documento JSON sia composto da una singola riga. È quindi necessario rendere flat il documento JSON in una stringa. Se il documento JSON è già flat, è possibile saltare questo passaggio e passare alla sezione successiva relativa all'analisi dei dati JSON. Per rendere flat il documento JSON, eseguire lo script seguente:

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

Il file JSON non elaborato è disponibile in wasb://processjson@hditutorialdata.blob.core.windows.net/. La tabella Hive StudentsRaw punta al documento JSON non elaborato non appiattito.

La tabella Hive StudentsOneLine archivia i dati nel file system predefinito di HDInsight nel percorso /json/students/.

L'istruzione INSERT popola la tabella StudentOneLine con i dati JSON flat.

L'istruzione SELECT restituisce solo una riga.

Ecco l'output dell'istruzione edizione Standard LECT:

HDInsight flating del documento JSON.

Analizzare i documenti JSON in Hive

Hive offre tre meccanismi diversi per l'esecuzione di query nei documenti JSON, oppure è possibile scrivere:

  • Usare la funzione definita dall'utente get_json_object.
  • Usare la funzione definita dall'utente json_tuple.
  • Usare il Serializzatore/Deserializzatore personalizzato (SerDe).
  • Scrivere una funzione definita dall'utente personalizzata tramite Python o altri linguaggi. Per altre informazioni su come eseguire il codice Python con Hive, vedere Funzione definita dall'utente Python con Apache Hive e Apache Pig.

Usare la funzione definita dall'utente get_json_object

Hive fornisce una funzione definita dall'utente predefinita denominata get_json_object che esegue query su JSON durante il runtime. Questo metodo accetta due argomenti: il nome della tabella e il nome del metodo. Il nome del metodo include il documento JSON flat e il campo JSON che deve essere analizzato. Di seguito è riportato un esempio per vedere come funziona questa funzione definita dall'utente.

La query seguente restituisce il nome e il cognome di ogni studente:

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

Ecco l'output quando si esegue questa query nella finestra della console:

Apache Hive ottiene la funzione definita dall'utente dell'oggetto JSON.

La funzione definita dall'utente get-json_object presenta delle limitazioni:

  • Poiché ogni campo della query richiede una nuova analisi della query, si ha un impatto sulle prestazioni.
  • GET_JSON_OBJECT() restituisce la rappresentazione di stringa di una matrice. Per convertire questa matrice in una matrice Hive, è necessario usare espressioni regolari per sostituire le parentesi quadre "[" e "]" e quindi è necessario chiamare split per ottenere la matrice.

Questa conversione è il motivo per cui il wiki hive consiglia di usare json_tuple.

Usare la funzione definita dall'utente json_tuple

Un'altra funzione definita dall'utente fornita da Hive è denominata json_tuple, che offre prestazioni migliori rispetto a get_ json _object. Questo metodo accetta un set di chiavi e una stringa JSON. Restituisce quindi una tupla di valori. La query seguente restituisce l'ID dello studente e il livello dal documento JSON:

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

Output dello script nella console di Hive:

Risultati della query JSON Apache Hive.

La json_tuple funzione definita dall'utente usa la sintassi della visualizzazione laterale in Hive, che consente json_tuple di creare una tabella virtuale applicando la funzione definito dall'utente a ogni riga della tabella originale. I documenti JSON complessi diventano troppo difficili da gestire a causa dell'uso ripetuto di LATERAL VIEW. Inoltre, JSON_TUPLE non è in grado di gestire JSON annidati.

Usare un'interfaccia SerDe personalizzata

SerDe è la scelta migliore per l'analisi dei documenti JSON nidificati. Consente di definire lo schema JSON e quindi è possibile usare lo schema per analizzare i documenti. Per istruzioni, vedere Come usare un Serde JSON personalizzato con Microsoft Azure HDInsight.

Riepilogo

Il tipo di operatore JSON in Hive scelto dipende dallo scenario in uso. Con un semplice documento JSON e un campo da cercare, scegliere il get_json_object UDF Hive. Se sono presenti più chiavi da cercare, è possibile usare json_tuple. Per i documenti annidati, usare json SerDe.

Passaggi successivi

Per gli articoli correlati, vedere: