আমি SET varname = value
হাইভ কিউএল এর এসকিউএল সমতুল্য সন্ধান করছি
আমি জানি আমি এরকম কিছু করতে পারি:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
তবে আমি এই ত্রুটিটি পেয়েছি:
অক্ষর '@' এখানে সমর্থিত নয়
আমি SET varname = value
হাইভ কিউএল এর এসকিউএল সমতুল্য সন্ধান করছি
আমি জানি আমি এরকম কিছু করতে পারি:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
তবে আমি এই ত্রুটিটি পেয়েছি:
অক্ষর '@' এখানে সমর্থিত নয়
উত্তর:
পরিবর্তনশীল প্রতিস্থাপনের জন্য আপনাকে বিশেষ হাইভেকনফ ব্যবহার করতে হবে । যেমন
hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'
একইভাবে, আপনি কমান্ড লাইনে যেতে পারেন:
% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql
মনে রাখবেন যে এনভ এবং সিস্টেম ভেরিয়েবলগুলিও রয়েছে তাই আপনি ${env:USER}
উদাহরণস্বরূপ উল্লেখ করতে পারেন ।
কমান্ড লাইন থেকে সমস্ত উপলব্ধ ভেরিয়েবলগুলি দেখতে রান করুন
% hive -e 'set;'
বা মধুচক্রের প্রম্পট থেকে চালান
hive> set;
আপডেট:
আমি এইচআইভিএল স্নিপেটগুলিতে রেখে এইচএইচএল স্নিপেটগুলিতে রেখেছি, আমি কুকুরটি ব্যবহার করে এইচআইভি সি এল আই থেকে অন্তর্ভুক্ত করতে পারি source
(বা কমান্ড লাইন থেকে -i বিকল্পটি পাস)। এখানে সুবিধাটি হ'ল ভেরিয়েবলটি হাইডেভর উপসর্গের সাথে বা ছাড়া ব্যবহার করা যেতে পারে এবং বৈশ্বিক বনাম স্থানীয় ব্যবহারের মতো কিছু হতে পারে।
সুতরাং, ধরুন কিছু সেটআপ। Hql রয়েছে যা একটি টেবিলের নাম ভেরিয়েবল সেট করে:
set hivevar:tablename=mytable;
তারপরে, আমি মাতালকে এনে দিতে পারি:
hive> source /path/to/setup.hql;
এবং কোয়েরিতে ব্যবহার করুন:
hive> select * from ${tablename}
অথবা
hive> select * from ${hivevar:tablename}
আমি একটি "স্থানীয়" টেবিল নামও সেট করতে পারতাম, যা {{টেবিল নাম of এর ব্যবহারকে প্রভাবিত করবে, তবে ive ive হিভেভার নয়: টেবিলের নাম}
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'
বনাম
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'
সম্ভবত সিএলআই থেকে খুব বেশি বোঝা যাচ্ছে না, তবে উত্স ব্যবহার করে এমন কোনও ফাইলে এইচকিএল থাকতে পারে তবে স্ক্রিপ্টের বাকী অংশে কিছু স্থানীয় "ভেরিয়েবল" সেট করে।
set CURRENT_DATE='2012-09-16';
${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
উত্তর এখানে অধিকাংশই পারেন ব্যবহারের পরামর্শ দিয়েছেন hiveconf
বা hivevar
নামস্থান পরিবর্তনশীল সঞ্চয় করতে। এবং এই সমস্ত উত্তর সঠিক। তবে আরও একটি নামস্থান রয়েছে।
চলকগুলি namespaces
ধরে রাখার জন্য মোট তিনটি উপলব্ধ।
এবং তাই আপনি যদি কোনও প্রশ্নের কোনও অংশ হিসাবে (যেমন তারিখ বা পণ্য_সংখ্যা) কোনও ভেরিয়েবল সংরক্ষণ করে থাকেন তবে আপনার নাম স্থানটি hivevar
নয়, hiveconf
নামস্থানটি ব্যবহার করা উচিত ।
এবং এটি এইভাবে কাজ করে।
হিভকনফ এখনও ডিফল্ট নেমস্পেস , সুতরাং আপনি যদি কোনও নেমস্পেস সরবরাহ না করেন তবে এটি আপনার পরিবর্তনশীলটিকে হিভকনফ নেমস্পেসে সংরক্ষণ করবে।
যাইহোক, যখন এটি একটি ভেরিয়েবল উল্লেখ করার কথা আসে, এটি সত্য নয়। ডিফল্টরূপে এটি হিভেভার নেমস্পেসকে বোঝায় । বিভ্রান্তিকর, তাই না? এটি নিম্নলিখিত উদাহরণ দিয়ে আরও স্পষ্ট হয়ে উঠতে পারে।
যদি আপনি নীচে উল্লিখিত হিসাবে নেমস্পেস সরবরাহ না করেন , পরিবর্তনশীল নেমস্পেসে var
সংরক্ষণ করা হবে hiveconf
।
set var="default_namespace";
সুতরাং, এটি অ্যাক্সেস করার জন্য আপনাকে hiveconf
নাম স্থান নির্দিষ্ট করতে হবে
select ${hiveconf:var};
এবং আপনি যদি নেমস্পেস সরবরাহ না করেন তবে এটি নীচে উল্লিখিত হিসাবে আপনাকে একটি ত্রুটি দেবে, কারণ আপনি যদি কোনও ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করেন তবে এটি hivevar
কেবল নেমস্পেসে যাচাই করে default এবং এর মধ্যে hivevar
কোনও ভেরিয়েবল নেইvar
select ${var};
আমরা স্পষ্টভাবে hivevar
নাম স্থান সরবরাহ করেছি
set hivevar:var="hivevar_namespace";
যেহেতু আমরা নামস্থান সরবরাহ করছি এটি কাজ করবে।
select ${hivevar:var};
এবং ডিফল্ট হিসাবে, একটি ভেরিয়েবল উল্লেখ করার সময় ব্যবহৃত ওয়ার্কস্পেস হ'ল hivevar
, নিম্নলিখিতটিও কাজ করবে।
select ${var};
আপনি কি ডলারের চিহ্ন এবং বন্ধনী ব্যবহার করার চেষ্টা করেছেন:
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
দুটি সহজ উপায়:
মধুচন্দী কনফ ব্যবহার করে
hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';
মুরগির vars ব্যবহার
আপনার সিএলআই-তে ভারসেট সেট করুন এবং তারপরে সেগুলি হাইভে ব্যবহার করুন
set hivevar:USER_NAME='FOO';
hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';
ডকুমেন্টেশন: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ পরিবর্তনশীল সাবস্টিটিউশন
একটি বিষয় মনে রাখবেন যে তারগুলি সেট করে তারপরে সেগুলি উল্লেখ করা। আপনাকে নিশ্চিত করতে হবে যে উদ্ধৃতিগুলি সংঘর্ষে নিচ্ছে না।
set start_date = '2019-01-21';
select ${hiveconf:start_date};
তারিখগুলি সেট করার পরে তারে কোডে উল্লেখ করে স্ট্রিংগুলি বিরোধ করতে পারে। এটি উপরের start_date সেট দিয়ে কাজ করবে না।
'${hiveconf:start_date}'
কোয়েরিতে আবার উল্লেখ করার সময় স্ট্রিংয়ের জন্য দু'বার একক বা ডাবল উদ্ধৃতি সেট না করার বিষয়ে আমাদের সচেতন থাকতে হবে।
কেবলমাত্র যদি কারও কাছে ক্লাইমের মাধ্যমে এইচাই কোয়েরিকে প্যারামিটারাইজ করা দরকার।
যেমন:
hive_query.sql
SELECT * FROM foo WHERE day >= '${hivevar:CURRENT_DATE}'
এখন ক্লায়েন্ট থেকে উপরের স্কেল ফাইল চালাও:
hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql
এই পদ্ধতিটি ব্যবহার করে দেখুন:
set t=20;
select *
from myTable
where age > '${hiveconf:t}';
এটি আমার প্ল্যাটফর্মে ভাল কাজ করে।
আপনি শেল স্ক্রিপ্ট রফতানিতে চলকটি রফতানি করতে পারেন CURRENT_DATE = "2012-09-16"
তারপরে এইচআইকেএল-তে আপনি পছন্দ করুন * যেখানে থেকে দিন নির্বাচন করুন> = '$ {এনভি: CURRENT_DATE}'
আপনি অন্য ক্যোয়ারীর আউটপুটটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন এবং পরবর্তীটি আপনি নিজের কোডটিতেও এটি ব্যবহার করতে পারেন:
set var=select count(*) from My_table;
${hiveconf:var};