Bearbeta och analysera JSON-dokument med hjälp av Apache Hive i Azure HDInsight
Lär dig hur du bearbetar och analyserar JSON-filer (JavaScript Object Notation) med hjälp av Apache Hive i Azure HDInsight. Den här artikeln använder följande JSON-dokument:
{
"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
}
]
}
Filen finns på wasb://processjson@hditutorialdata.blob.core.windows.net/
. Mer information om hur du använder Azure Blob Storage med HDInsight finns i Använda HDFS-kompatibel Azure Blob Storage med Apache Hadoop i HDInsight. Du kan kopiera filen till standardcontainern för klustret.
I den här artikeln använder du Apache Hive-konsolen. Anvisningar om hur du öppnar Hive-konsolen finns i Använda Apache Ambari Hive View med Apache Hadoop i HDInsight.
Kommentar
Hive-vyn är inte längre tillgänglig i HDInsight 4.0.
Platta ut JSON-dokument
Metoderna som anges i nästa avsnitt kräver att JSON-dokumentet består av en enda rad. Därför måste du platta ut JSON-dokumentet till en sträng. Om JSON-dokumentet redan är utplattat kan du hoppa över det här steget och gå direkt till nästa avsnitt om att analysera JSON-data. Om du vill platta ut JSON-dokumentet kör du följande skript:
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
Den råa JSON-filen finns på wasb://processjson@hditutorialdata.blob.core.windows.net/
. Tabellen StudentsRaw Hive pekar på det råa JSON-dokumentet som inte är utplattat.
Tabellen StudentsOneLine Hive lagrar data i HDInsights standardfilsystem under sökvägen /json/students/ .
INSERT-instruktionen fyller tabellen StudentOneLine med de utplattade JSON-data.
SELECT-instruktionen returnerar bara en rad.
Här är utdata från SELECT-instruktionen:
Analysera JSON-dokument i Hive
Hive innehåller tre olika mekanismer för att köra frågor på JSON-dokument, eller så kan du skriva egna:
- Använd den get_json_object användardefinierade funktionen (UDF).
- Använd json_tuple UDF.
- Använd den anpassade Serializer/Deserializer (SerDe).
- Skriv din egen UDF med hjälp av Python eller andra språk. Mer information om hur du kör din egen Python-kod med Hive finns i Python UDF med Apache Hive och Apache Pig.
Använda get_json_object UDF
Hive tillhandahåller en inbyggd UDF med namnet get_json_object som frågar JSON under körningen. Den här metoden tar två argument: tabellnamnet och metodnamnet. Metodnamnet har det utplattade JSON-dokumentet och det JSON-fält som måste parsas. Nu ska vi titta på ett exempel för att se hur UDF fungerar.
Följande fråga returnerar förnamn och efternamn för varje elev:
SELECT
GET_JSON_OBJECT(StudentsOneLine.json_body,'$.StudentDetails.FirstName'),
GET_JSON_OBJECT(StudentsOneLine.json_body,'$.StudentDetails.LastName')
FROM StudentsOneLine;
Här är utdata när du kör den här frågan i konsolfönstret:
Det finns begränsningar i get_json_object UDF:
- Eftersom varje fält i frågan kräver en omarsering av frågan påverkar det prestandan.
- GET_JSON_OBJECT() returnerar strängrepresentationen av en matris. Om du vill konvertera den här matrisen till en Hive-matris måste du använda reguljära uttryck för att ersätta hakparenteserna "[" och "]", och sedan måste du även anropa split för att hämta matrisen.
Den här konverteringen är anledningen till att Hive-wikin rekommenderar att du använder json_tuple.
Använda json_tuple UDF
En annan UDF som tillhandahålls av Hive kallas json_tuple, vilket är bättre än get_ json-_object. Den här metoden tar en uppsättning nycklar och en JSON-sträng. Returnerar sedan en tuppeln med värden. Följande fråga returnerar elev-ID:t och betyget från JSON-dokumentet:
SELECT q1.StudentId, q1.Grade
FROM StudentsOneLine jt
LATERAL VIEW JSON_TUPLE(jt.json_body, 'StudentId', 'Grade') q1
AS StudentId, Grade;
Utdata från det här skriptet i Hive-konsolen:
json_tuple
UDF använder syntaxen för lateral vy i Hive, vilket gör att json_tuple kan skapa en virtuell tabell genom att använda UDT-funktionen på varje rad i den ursprungliga tabellen. Komplexa JSON:er blir för otympliga på grund av upprepad användning av LATERAL VIEW. Dessutom kan JSON_TUPLE inte hantera kapslade JSON:er.
Använda en anpassad SerDe
SerDe är det bästa valet för att parsa kapslade JSON-dokument. Du kan definiera JSON-schemat och sedan använda schemat för att parsa dokumenten. Anvisningar finns i Så här använder du en anpassad JSON SerDe med Microsoft Azure HDInsight.
Sammanfattning
Vilken typ av JSON-operator i Hive du väljer beror på ditt scenario. Med ett enkelt JSON-dokument och ett fält att söka efter väljer du Hive UDF-get_json_object. Om du har mer än en nyckel att slå upp kan du använda json_tuple. Använd JSON SerDe för kapslade dokument.
Nästa steg
Relaterade artiklar finns i: