JSON-documenten verwerken en analyseren met behulp van Apache Hive in Azure HDInsight

Meer informatie over het verwerken en analyseren van JSON-bestanden (JavaScript Object Notation) met behulp van Apache Hive in Azure HDInsight. In dit artikel wordt het volgende JSON-document gebruikt:

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

Het bestand is te vinden op wasb://processjson@hditutorialdata.blob.core.windows.net/. Zie HdFS-compatibele Azure Blob Storage gebruiken met Apache Hadoop in HDInsight voor meer informatie over het gebruik van Azure Blob Storage met HDInsight. U kunt het bestand kopiëren naar de standaardcontainer van uw cluster.

In dit artikel gebruikt u de Apache Hive-console. Zie Apache Ambari Hive View gebruiken met Apache Hadoop in HDInsight voor instructies over het openen van de Hive-console.

Notitie

Hive-weergave is niet meer beschikbaar in HDInsight 4.0.

JSON-documenten plat maken

Voor de methoden die in de volgende sectie worden vermeld, moet het JSON-document bestaan uit één rij. U moet het JSON-document dus platmaken aan een tekenreeks. Als uw JSON-document al plat is, kunt u deze stap overslaan en direct naar de volgende sectie gaan over het analyseren van JSON-gegevens. Als u het JSON-document wilt platmaken, voert u het volgende script uit:

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

Het onbewerkte JSON-bestand bevindt zich op wasb://processjson@hditutorialdata.blob.core.windows.net/. De Tabel StudentsRaw Hive verwijst naar het onbewerkte JSON-document dat niet plat is.

De tabel StudentsOneLine Hive slaat de gegevens op in het standaardbestandssysteem van HDInsight onder het pad /json/students/ .

Met de INSERT-instructie wordt de tabel StudentOneLine gevuld met de platgemaakte JSON-gegevens.

De SELECT-instructie retourneert slechts één rij.

Dit is de uitvoer van de SELECT-instructie :

HDInsight platmaken van het JSON-document.

JSON-documenten analyseren in Hive

Hive biedt drie verschillende mechanismen voor het uitvoeren van query's op JSON-documenten of u kunt uw eigen query's schrijven:

  • Gebruik de get_json_object door de gebruiker gedefinieerde functie (UDF).
  • Gebruik de json_tuple UDF.
  • Gebruik de aangepaste Serializer/Deserializer (SerDe).
  • Schrijf uw eigen UDF met behulp van Python of andere talen. Zie Python UDF met Apache Hive en Apache Pig voor meer informatie over het uitvoeren van uw eigen Python-code met Hive.

De get_json_object UDF gebruiken

Hive biedt een ingebouwde UDF met de naam get_json_object die JSON tijdens runtime opvraagt. Deze methode heeft twee argumenten: de tabelnaam en de naam van de methode. De methodenaam bevat het platgemaakte JSON-document en het JSON-veld dat moet worden geparseerd. Laten we eens kijken naar een voorbeeld om te zien hoe deze UDF werkt.

De volgende query retourneert de voornaam en achternaam voor elke leerling/student:

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

Dit is de uitvoer wanneer u deze query uitvoert in het consolevenster:

Apache Hive haalt JSON-object UDF op.

Er gelden beperkingen van de get_json_object UDF:

  • Omdat elk veld in de query het herstellen van de query vereist, is dit van invloed op de prestaties.
  • GET_JSON_OBJECT() retourneert de tekenreeksweergave van een matrix. Als u deze matrix wilt converteren naar een Hive-matrix, moet u reguliere expressies gebruiken om de vierkante haken [en ]te vervangen. Vervolgens moet u split aanroepen om de matrix op te halen.

Deze conversie is waarom de Hive-wiki aanbeveelt dat u json_tuple gebruikt.

De json_tuple UDF gebruiken

Een andere UDF van Hive wordt json_tuple genoemd, wat beter werkt dan get_ json-_object. Deze methode gebruikt een set sleutels en een JSON-tekenreeks. Retourneert vervolgens een tuple met waarden. De volgende query retourneert de student-id en het cijfer uit het JSON-document:

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

De uitvoer van dit script in de Hive-console:

Queryresultaten van Apache Hive json.

De json_tuple UDF maakt gebruik van de syntaxis van de zijdelingse weergave in Hive, waarmee json_tuple een virtuele tabel kunt maken door de UDT-functie toe te passen op elke rij van de oorspronkelijke tabel. Complexe JSON's worden te onhandig vanwege het herhaalde gebruik van LATERAL VIEW. Bovendien kan JSON_TUPLE geneste JSON's niet verwerken.

Een aangepaste SerDe gebruiken

SerDe is de beste keuze voor het parseren van geneste JSON-documenten. Hiermee kunt u het JSON-schema definiëren en vervolgens kunt u het schema gebruiken om de documenten te parseren. Zie Een aangepaste JSON SerDe gebruiken met Microsoft Azure HDInsight voor instructies.

Samenvatting

Het type JSON-operator in Hive dat u kiest, is afhankelijk van uw scenario. Kies met een eenvoudig JSON-document en één veld dat u wilt opzoeken de Hive UDF-get_json_object. Als u meer dan één sleutel hebt om op te zoeken, kunt u json_tuple gebruiken. Gebruik de JSON SerDe voor geneste documenten.

Volgende stappen

Zie voor verwante artikelen: