Saya mencari padanan SQL SET varname = value
di Hive QL
Saya tahu saya bisa melakukan sesuatu seperti ini:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
Tapi kemudian saya mendapatkan kesalahan ini:
karakter '@' tidak didukung di sini
Jawaban:
Anda perlu menggunakan hiveconf khusus untuk substitusi variabel. misalnya
Demikian pula, Anda dapat meneruskan baris perintah:
Perhatikan bahwa ada env dan variabel sistem juga, jadi Anda bisa mereferensikan
${env:USER}
misalnya.Untuk melihat semua variabel yang tersedia, dari baris perintah, jalankan
atau dari prompt sarang, lari
Pembaruan: Saya sudah mulai menggunakan variabel hivevar juga, menempatkannya ke dalam cuplikan hql yang dapat saya sertakan dari sarang CLI menggunakan
source
perintah (atau berikan opsi -i dari baris perintah). Manfaatnya di sini adalah bahwa variabel kemudian dapat digunakan dengan atau tanpa awalan sarang, dan memungkinkan sesuatu yang mirip dengan penggunaan global vs lokal.Jadi, asumsikan memiliki beberapa setup.hql yang menetapkan variabel tablename:
kemudian, saya bisa membawa ke sarang:
dan gunakan dalam kueri:
atau
Saya juga bisa menyetel tablename "lokal", yang akan memengaruhi penggunaan $ {tablename}, tetapi tidak untuk $ {hivevar: tablename}
vs.
Mungkin tidak terlalu berarti dari CLI, tetapi dapat memiliki hql dalam file yang menggunakan source , tetapi mengatur beberapa variabel "secara lokal" untuk digunakan dalam skrip lainnya.
sumber
set CURRENT_DATE='2012-09-16';
Anda dapat merujuknya nanti dengan${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
Sebagian besar jawaban di sini menyarankan penggunaan
hiveconf
atauhivevar
namespace untuk menyimpan variabel. Dan semua jawaban itu benar. Namun, ada satu namespace lagi.Ada tiga total yang
namespaces
tersedia untuk menyimpan variabel.Jadi jika Anda menyimpan variabel sebagai bagian dari kueri (yaitu tanggal atau nomor_produk), Anda harus menggunakan
hivevar
namespace dan bukanhiveconf
namespace.Dan begitulah cara kerjanya.
hiveconf masih merupakan namespace default , jadi jika Anda tidak memberikan namespace apa pun, variabel Anda akan disimpan di namespace hiveconf.
Namun, ketika merujuk pada variabel, itu tidak benar. Secara default mengacu pada namespace sarang . Membingungkan, bukan? Ini bisa menjadi lebih jelas dengan contoh berikut.
Jika Anda tidak memberikan namespace seperti yang disebutkan di bawah, variabel
var
akan disimpan dihiveconf
namespace.Jadi, untuk mengakses ini, Anda perlu menentukan
hiveconf
namespaceDan jika Anda tidak memberikan namespace itu akan memberi Anda kesalahan seperti yang disebutkan di bawah ini, alasannya adalah bahwa secara default jika Anda mencoba mengakses variabel, ia hanya memeriksa di
hivevar
namespace. Dan dihivevar
dalamnya tidak ada variabel bernamavar
Kami telah menyediakan
hivevar
namespace secara eksplisitkarena kami menyediakan namespace, ini akan berfungsi.
Dan sebagai default, ruang kerja yang digunakan selama merujuk variabel adalah
hivevar
, berikut ini juga akan berfungsi.sumber
Sudahkah Anda mencoba menggunakan tanda dolar dan tanda kurung seperti ini:
sumber
Dua cara mudah:
Menggunakan conf hive
Menggunakan vars sarang
Pada CLI Anda set vars dan kemudian gunakan di sarang
Dokumentasi: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
sumber
Satu hal yang harus diperhatikan adalah mengatur string kemudian merujuk kembali padanya. Anda harus memastikan bahwa kutipan tidak bertabrakan.
Saat menetapkan tanggal, rujuklah ke dalam kode karena string dapat bertentangan. Ini tidak akan berfungsi dengan start_date yang disetel di atas.
Kami harus berhati-hati untuk tidak menetapkan dua kali tanda kutip tunggal atau ganda untuk string saat merujuk kembali ke mereka dalam kueri.
sumber
Untuk berjaga-jaga jika seseorang perlu membuat parameter kueri sarang melalui cli.
Misalnya:
hive_query.sql
Sekarang jalankan file sql di atas dari cli:
sumber
Coba metode ini:
itu bekerja dengan baik di platform saya.
sumber
Anda dapat mengekspor variabel dalam ekspor skrip shell CURRENT_DATE = "2012-09-16"
Kemudian di hiveql Anda suka SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}'
sumber
Anda dapat menyimpan keluaran dari kueri lain dalam variabel dan terakhir Anda dapat menggunakan yang sama dalam kode Anda:
sumber