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:

HDInsight platta ut JSON-dokumentet.

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:

Apache Hive hämtar JSON-objektet UDF.

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:

Apache Hive json-frågeresultat.

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: