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 :
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:
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:
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: