DevVeri.com

Boğulacaksan büyük veride boğul!

Hive İç İçe Sorgu Kullanımı

Merhaba arkadaşlar,

Bildiğiniz gibi HIVE aracı ile SQL kurallarına benzer bir dil ile sorgulamalar yapabiliyoruz. Ancak bu noktada ticari veritabanlarının sağlamış olduğu kadar fonksiyonel geliştirme yapamadığımız bir durumda söz konusu.

Öncelikle, HIVE’ın veritabanı veya geliştirici kişiler için SQL kolaylığında sorgulama imkanı sağlamasına rağmen, Hadoop ekosisteminin büyük dosya yapıları üzerinde analiz yapma mantığı etrafında geliştiğini unutmamamız gerekiyor.

İşte, bu noktada bazı limitler ile karşılaşıyoruz, çünkü açık kaynak bir dağıtım olan HIVE, sorgularımızı file işlemleri seviyesine getirirken yaptığı dönüşümlerde, sorgu mantığını anlama işleminde, ticari veritabanları kadar etkin bir işleyişe sahip değil.

Bu yazımda bu konuya örneklemek için içiçe sorgular içeren bir işlemde aldığım hatadan ve yaptığım çalışmadan bahsedeceğim.

Aşağıdaki gibi klasik veritabanlarımızda çalışabilecek bir sorgumuzu ele alalım:

SELECT T1.SESSION_ID, T1.KEY, T1.VALUE
  FROM SCHEMA1.T1
 WHERE     session_id IN
              (SELECT SESSION_ID
                 FROM SCHEMA1.T4
                WHERE session_id IN
                         (SELECT t3.SESSION_ID
                            FROM SCHEMA1.T2 t2,
                                 SCHEMA1.T3 t3
                           WHERE     t2.VALUE IN (.........)
                                 AND t3.VALUE = '..............'
                                 AND t2.SESSION_ID = t3.SESSION_ID))
 AND T1.VALUE BETWEEN '2015-May-01 00:00:00' AND '2015-Dec-30 00:00:00’

Bu sorgumuz içiçe select cümleciklerinden oluşmakta, HIVE üzerinde çalıştırdığımda aşağıdaki hatayı almaktayım. Örnekteki HIVE sürümü 1.1.0 .

FAILED: SemanticException Line 1:190 Unsupported SubQuery Expression 'session_id' in definition of SubQuery sq_1 [
..........................
] used as sq_1 at Line 1:120: Nested SubQuery expressions are not supported

Gördüğümüz gibi kızdı, içiçe sorgularda değişkenlerin kullanımı ile ilgili bir problemden bahsediyor.

Açık kaynak araçların dökümantasyonları da gerçekten özenle hazırlanıyor. Bu hatayı arattığımda HIVE’ın dökümantasyonunda içiçe sorgular kısmında aşağıdaki bilgileri gördüm. Benim de bazılarını tecrübe ettiğim bilgiler şu şekilde. İsterseniz kendinizde test edebilirsiniz.

  • Alt sorgulara İSİM verilmesi gerekiyor.
  • Alt sorgular FROM kısmında yer almalı.
  • İçiçe sorgularda Kolon isimleri tablo isimleri ile beraber verilmeli.
  • Alt sorgu, değişkenin sağ tarafında yer almalı
  • IN , NOT IN , EXISTS ve NOT EXISTS kullanılabilir
  • IN ve NOT IN kullanımında tek bir kolon dönülmeli
  • EXISTS ve NOT EXISTS kullanımında alt sorgular en az bir kolon üzerinden eşlenmeli
  • Sorgunun üst seviyesine refereans olan kolonlar ancak WHERE kısmında kullanılabilir

Bu bilgiler ışığında sorgumuzu tekrar yazarsak ve gereksiz selectleri azaltırsak aşağıdaki gibi bir sorgu ortaya çıkıyor:

SELECT t1.SESSION_ID, t1.KEY, t1.VALUE
  FROM SCHEMA1.T1 as t1, SCHEMA1.T4 as t4
 WHERE     t1.session_id = t4.session_id
       AND t4.session_id IN
              (SELECT t3.SESSION_ID
                 FROM SCHEMA1.T2 as t2, SCHEMA1.T3 as t3
                WHERE     t2.VALUE IN
                             (..................)
                      AND t3.VALUE = '........................'
                      AND t2.SESSION_ID = t3.SESSION_ID)
      AND t1.VALUE BETWEEN '2015-May-01 00:00:00' AND '2015-Dec-30 00:00:00';

Burda gördüğünüz gibi tablo ve sorgulara İSİM verdim yani etiketledim ve alt sorgulardaki kolon isimleri açıkca tablolara bağlandı. Gereksiz select cümleleri çıkartıldı.

Sorguyu bu halde çalıştırdığımda aşağıdaki gibi başarılı bir şekilde sonlanmaktadır.

2015-12-08 01:03:28     End of local task; Time Taken: 4.188 sec.
Execution completed successfully
MapredLocal task succeeded
Launching Job 4 out of 4
...
2015-12-08 13:03:52,249 Stage-6 map = 94%,  reduce = 0%, Cumulative CPU 45.93 sec
2015-12-08 13:03:53,265 Stage-6 map = 100%,  reduce = 0%, Cumulative CPU 49.32 sec
MapReduce Total cumulative CPU time: 49 seconds 320 msec
Ended Job = job_1448973637348_0844
MapReduce Jobs Launched:
Stage-Stage-1: Map: 2098  Reduce: 1099   Cumulative CPU: 1452028.98 sec   HDFS Read: 3916425613388 HDFS Write: 105504 SUCCESS
Stage-Stage-4: Map: 1982  Reduce: 1099   Cumulative CPU: 120765.75 sec   HDFS Read: 259305477973 HDFS Write: 7688479 SUCCESS
Stage-Stage-6: Map: 16   Cumulative CPU: 49.32 sec   HDFS Read: 482421 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 18 days 4 hours 54 minutes 4 seconds 50 msec
OK
Time taken: 6884.603 seconds

Bu örnekte kullandığım tabloların büyüklükleri bu şekilde.

T1 -> Satır# 902.942.362.399 , on disk   3.5 T
T2 -> Satır#  28.861.733.076 , on disk 129.8 G
T3->  Satır#  29.576.675.998 , on disk 111.6 G
T4- > Satır#  29.577.122.203 , on disk  66.2 G

Evet arkadaşlar, çalışma burda sonlanıyor. Umarım farkındalık anlamında faydalı bir yazı olmuştur. Sorularınız olursa iletişim kurmanızdan memnuniyet duyarım.

İyi çalışmalar.

Kaynak:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries#LanguageManualSubQueries-SubqueriesintheWHEREClause
https://issues.apache.org/jira/browse/HIVE-784

, , ,

2 thoughts on “Hive İç İçe Sorgu Kullanımı

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir