SET varname = valueHive QL'deki SQL eşdeğerini arıyorum
Bunun gibi bir şey yapabileceğimi biliyorum:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
Ama sonra şu hatayı alıyorum:
Burada '@' karakteri desteklenmez
SET varname = valueHive QL'deki SQL eşdeğerini arıyorum
Bunun gibi bir şey yapabileceğimi biliyorum:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
Ama sonra şu hatayı alıyorum:
Burada '@' karakteri desteklenmez
Yanıtlar:
Değişken ikamesi için özel hiveconf'u kullanmanız gerekir . Örneğin
hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'
benzer şekilde, komut satırını da iletebilirsiniz:
% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql
Orada Not olduğunu env ve sistem başvurabileceğiniz böylece değişkenler yanı ${env:USER}örneğin.
Kullanılabilir tüm değişkenleri görmek için komut satırından şunu çalıştırın:
% hive -e 'set;'
veya kovan isteminden çalıştırın
hive> set;
Güncelleme: Hivevar değişkenlerini de
kullanmaya başladım , onları hql parçacıkları içine koydum , sourcekomutu kullanarak kovan CLI'den ekleyebilirim (veya komut satırından -i seçeneği olarak geçirebilirim). Buradaki avantaj, değişkenin daha sonra hivevar öneki ile ya da olmadan kullanılabilmesi ve küresel ve yerel kullanıma benzer bir şeye izin vermesidir.
Öyleyse, bir tablename değişkeni ayarlayan bazı setup.hql'ye sahip olduğunuzu varsayın :
set hivevar:tablename=mytable;
sonra, kovana getirebilirim:
hive> source /path/to/setup.hql;
ve sorguda kullan:
hive> select * from ${tablename}
veya
hive> select * from ${hivevar:tablename}
Ayrıca, $ {tablename} kullanımını etkileyecek, ancak $ {hivevar: tablename} kullanılmayan bir "yerel" tablo adı da ayarlayabilirdim
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'
vs
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'
Muhtemelen CLI'den çok fazla bir şey ifade etmiyor, ancak kaynağı kullanan bir dosyada hql olabilir , ancak komut dosyasının geri kalanında kullanmak için bazı değişkenleri "yerel olarak" ayarlayın.
set CURRENT_DATE='2012-09-16';daha sonra${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
Buradaki yanıtların çoğu , değişkeni depolamak için ad alanını kullanmayı hiveconfveya hivevarad alanını önermiştir . Ve tüm bu cevaplar doğru. Ancak, bir ad alanı daha vardır.
namespacesDeğişkenleri tutmak için toplam üç tane mevcuttur.
Dolayısıyla, bir sorgunun parçası olarak bir değişkeni depoluyorsanız (yani tarih veya ürün_sayı), hivevarad alanını değil hiveconfad alanını kullanmalısınız.
Ve bu nasıl işlediğidir.
hiveconf hala varsayılan ad alanıdır , bu nedenle herhangi bir ad alanı sağlamazsanız değişkeninizi hiveconf ad alanında depolar.
Ancak konu bir değişkene atıfta bulunmak olduğunda doğru değildir. Varsayılan olarak hivevar ad alanını ifade eder . Kafa karıştırıcı, değil mi? Aşağıdaki örnekle daha net hale gelebilir.
Eğer yoksa ad sağlamaz aşağıda belirtildiği gibi değişken varsaklanacaktır hiveconfad.
set var="default_namespace";
Dolayısıyla, buna erişmek için hiveconf ad alanı belirtmeniz gerekir.
select ${hiveconf:var};
Ve eğer ad alanı sağlamazsanız , aşağıda belirtildiği gibi size bir hata verecektir, bunun nedeni, bir değişkene erişmeye çalışırsanız, hivevaryalnızca ad alanında kontrol etmesidir. Ve içinde hivevarisimli bir değişken yokvar
select ${var};
Açıkça hivevarad alanı sağladık
set hivevar:var="hivevar_namespace";
ad alanını sağladığımız için bu işe yarayacaktır.
select ${hivevar:var};
Ve varsayılan olarak, bir değişkene atıfta bulunurken kullanılan çalışma alanı hivevar, aşağıdakiler de çalışacaktır.
select ${var};
Dolar işaretini ve parantezleri şu şekilde kullanmayı denediniz mi :
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
İki kolay yol:
Hive conf kullanma
hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';
Kovan değişkenlerini kullanma
CLI set değişkenlerinizde ve ardından bunları kovanda kullanın
set hivevar:USER_NAME='FOO';
hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';
Belgeler: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
Dikkat edilmesi gereken bir şey, dizeleri belirlemek ve sonra onlara geri dönmektir. Alıntıların çakışmadığından emin olmalısın.
set start_date = '2019-01-21';
select ${hiveconf:start_date};
Tarihleri ayarlarken, dizeler çakışabileceğinden bunlara kodla atıfta bulunun. Bu, yukarıda ayarlanan başlangıç_tarihi ile çalışmaz.
'${hiveconf:start_date}'
Sorguda geri dönerken dizeler için iki kez tek veya çift tırnak koymamaya dikkat etmeliyiz.
Birinin kovan sorgusunu cli aracılığıyla parametreleştirmesi gerekmesi durumunda.
Örneğin:
hive_query.sql
SELECT * FROM foo WHERE day >= '${hivevar:CURRENT_DATE}'
Şimdi yukarıdaki sql dosyasını cli'den çalıştırın:
hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql
Değişkeni kabuk komut dosyası dışa aktarabilirsiniz CURRENT_DATE = "2012-09-16"
Sonra hiveql'de SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}' gibi
Başka bir sorgunun çıktısını bir değişkende saklayabilir ve ardından aynısını kodunuzda kullanabilirsiniz:
set var=select count(*) from My_table;
${hiveconf:var};