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
Kmeans ve Kmedoids Kümeleme Apache Sentry ile Yetkilendirme
teşekür 🙂
bu güzel paylaşımınız için teşekkürler