Azure HDInsight'ta Apache Hive kullanarak JSON belgelerini işleme ve analiz etme

Azure HDInsight'ta Apache Hive kullanarak JavaScript Nesne Gösterimi (JSON) dosyalarını işlemeyi ve analiz etmeyi öğrenin. Bu makalede aşağıdaki JSON belgesi kullanılır:

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

Dosya adresinde wasb://processjson@hditutorialdata.blob.core.windows.net/bulunabilir. HDInsight ile Azure Blob depolamayı kullanma hakkında daha fazla bilgi için bkz . HDInsight'ta Apache Hadoop ile HDFS uyumlu Azure Blob depolama kullanma. Dosyayı kümenizin varsayılan kapsayıcısına kopyalayabilirsiniz.

Bu makalede Apache Hive konsolunu kullanacaksınız. Hive konsolunu açma yönergeleri için bkz . HDInsight'ta Apache Hadoop ile Apache Ambari Hive Görünümünü kullanma.

Not

Hive Görünümü artık HDInsight 4.0'da kullanılamaz.

JSON belgelerini düzleştirme

Sonraki bölümde listelenen yöntemler, JSON belgesinin tek bir satırdan oluşmasını gerektirir. Bu nedenle, JSON belgesini bir dizeye düzleştirmeniz gerekir. JSON belgeniz zaten düzleştirilmişse, bu adımı atlayabilir ve doğrudan JSON verilerini çözümlemeyle ilgili sonraki bölüme gidebilirsiniz. JSON belgesini düzleştirmek için aşağıdaki betiği çalıştırın:

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

Ham JSON dosyası konumunda wasb://processjson@hditutorialdata.blob.core.windows.net/bulunur. StudentsRaw Hive tablosu düzleştirilmiş olmayan ham JSON belgesini gösterir.

StudentsOneLine Hive tablosu, verileri HDInsight varsayılan dosya sisteminde /json/students/ yolunun altında depolar.

INSERT deyimi StudentOneLine tablosunu düzleştirilmiş JSON verileriyle doldurur.

SELECT deyimi yalnızca bir satır döndürür.

SELECT deyiminin çıktısı aşağıdadır:

HDInsight, JSON belgesini düzleştirme.

Hive'da JSON belgelerini analiz etme

Hive, JSON belgelerinde sorgu çalıştırmak için üç farklı mekanizma sağlar veya kendiniz yazabilirsiniz:

  • kullanıcı tanımlı işlevi (UDF) get_json_object kullanın.
  • json_tuple UDF'yi kullanın.
  • Özel Seri Hale Getirici/Seri Durumdan Çıkarıcı (SerDe) kullanın.
  • Python veya diğer dilleri kullanarak kendi UDF'nizi yazın. Hive ile kendi Python kodunuzu çalıştırma hakkında daha fazla bilgi için bkz . Apache Hive ve Apache Pig ile Python UDF.

get_json_object UDF'yi kullanma

Hive, çalışma zamanı sırasında JSON sorgulayan get_json_object adlı yerleşik bir UDF sağlar. Bu yöntem iki bağımsız değişken alır: tablo adı ve yöntem adı. Yöntem adı düzleştirilmiş JSON belgesine ve ayrıştırılması gereken JSON alanına sahiptir. Şimdi bu UDF'nin nasıl çalıştığını görmek için bir örneğe bakalım.

Aşağıdaki sorgu, her öğrencinin adını ve soyadını döndürür:

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

Konsol penceresinde bu sorguyu çalıştırdığınızda şu çıktıyı görebilirsiniz:

Apache Hive, JSON nesnesi UDF'lerini alır.

get_json_object UDF ile ilgili sınırlamalar vardır:

  • Sorgudaki her alan sorgunun yeniden ayrıştırılması gerektirdiğinden, performansı etkiler.
  • GET_JSON_OBJECT() bir dizinin dize gösterimini döndürür. Bu diziyi hive dizisine dönüştürmek için "[" ve "]" köşeli ayraçlarını değiştirmek için normal ifadeler kullanmanız ve ardından diziyi almak için split'i çağırmanız gerekir.

Bu dönüştürme, Hive wiki'sinin json_tuple kullanmanızı önermesinin nedenidir.

json_tuple UDF'yi kullanma

Hive tarafından sağlanan başka bir UDF, get_ json _object daha iyi olan json_tuple olarak adlandırılır. Bu yöntem bir anahtar kümesi ve bir JSON dizesi alır. Ardından bir değer demetini döndürür. Aşağıdaki sorgu, JSON belgesinden öğrenci kimliğini ve notunu döndürür:

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

Hive konsolunda bu betiğin çıktısı:

Apache Hive json sorgu sonuçları.

json_tuple UDF, Hive'da UDT işlevini özgün tablonun her satırına uygulayarak json_tuple sanal tablo oluşturmasını sağlayan yanal görünüm söz dizimini kullanır. LATERAL VIEW'un tekrarlanan kullanımı nedeniyle karmaşık JSON'lar çok zor hale gelir. Ayrıca, JSON_TUPLE iç içe JSON'ları işleyemez.

Özel SerDe kullanma

SerDe, iç içe JSON belgelerini ayrıştırma için en iyi seçenektir. JSON şemasını tanımlamanıza olanak tanır ve sonra belgeleri ayrıştırmak için şemayı kullanabilirsiniz. Yönergeler için bkz . Microsoft Azure HDInsight ile özel JSON SerDe kullanma.

Özet

Hive'da seçtiğiniz JSON işlecinin türü senaryonuza bağlıdır. Basit bir JSON belgesi ve aranacak bir alan varsa Hive UDF get_json_object seçin. Aramanız gereken birden fazla anahtar varsa json_tuple kullanabilirsiniz. İç içe belgeler için JSON SerDe kullanın.

Sonraki adımlar

İlgili makaleler için bkz: