এইচআইভি স্ক্রিপ্টগুলিতে কীভাবে ভেরিয়েবল সেট করবেন


102

আমি SET varname = valueহাইভ কিউএল এর এসকিউএল সমতুল্য সন্ধান করছি

আমি জানি আমি এরকম কিছু করতে পারি:

SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE

তবে আমি এই ত্রুটিটি পেয়েছি:

অক্ষর '@' এখানে সমর্থিত নয়


দুর্ভাগ্যক্রমে, স্ট্রিং ভেরিয়েবল সেট করার কোনও নিরাপদ উপায় নেই কারণ যদি কেউ ভেরিয়েবলটি সেট না করেই ক্যোয়ারি চালায়, তবে স্ট্রিংটি ভেরিয়েবল কলটিকে স্ট্রিং হিসাবে সহজেই ব্যবহার করবে। :(
সংযুক্তিবাদী

উত্তর:


201

পরিবর্তনশীল প্রতিস্থাপনের জন্য আপনাকে বিশেষ হাইভেকনফ ব্যবহার করতে হবে । যেমন

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'

সম্ভবত সিএলআই থেকে খুব বেশি বোঝা যাচ্ছে না, তবে উত্স ব্যবহার করে এমন কোনও ফাইলে এইচকিএল থাকতে পারে তবে স্ক্রিপ্টের বাকী অংশে কিছু স্থানীয় "ভেরিয়েবল" সেট করে।


1
এটি কমান্ড লাইন থেকে প্যারামিটারটি পার করছে যা আমি কর্মস্পেয়ারে কোয়েরি তৈরি করছি এবং ভিক্ষার জন্য কয়েকটি কনট্যান্ট সেট করা দরকার যাতে আমার স্ক্রিপ্টে 10 বার হার্ড কোড তারিখ না হয়। এরকম কিছু কি সম্ভব?
ব্যবহারকারী1678312

উভয় set CURRENT_DATE='2012-09-16';${hiveconf:CURRENT_DATE}
উপায়েই

1
যদি আমার একাধিক এইচআইভি কাজ একই সাথে চলতে থাকে তবে এটি কীভাবে কাজ করবে? তারা কি একে অপরের কাছ থেকে মান সংগ্রহ করা শেষ করবে? অটোমেশনে আমি এইচকিউএল ফাইলটি কিছু এসইটি স্টেটমেন্ট দিয়ে প্রিপেন্ড করে তৈরি করছি। আমি নিশ্চিত করতে চাই যে আমি একই সময়ে দুটি কাজ জমা দিচ্ছি যা একই ভেরিয়েবল নাম ব্যবহার করে, একটি কাজ অন্য জব থেকে মান গ্রহণ করবে না। এখানে শব্দার্থবিজ্ঞান আপনার উত্তর থেকে পরিষ্কার হয় না।
ম্যাটডি

5
এই হাইভ সার্ভারে আমার জন্য কাজ করে। তবে, আমি ইন্টেলিজজে স্থানীয় মেশিনে কিছু সংহতকরণ পরীক্ষা সেটআপ করেছি। এইভাবে চলকটি ব্যবহার করার চেষ্টা করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়ে যাচ্ছি:FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
চেপুখা

1
@ ডেটাবেসকোডার আমার জানা মতে, এর মতো আর কোনও কিছুই কার্যকর হবে না। যখনই আমার এর মতো কিছু দরকার হয়, আমাকে প্রথমে জিজ্ঞাসা করতে হবে এবং তারপরে "--hiveconf" এর মাধ্যমে পাস করতে হবে
libjack

21

উত্তর এখানে অধিকাংশই পারেন ব্যবহারের পরামর্শ দিয়েছেন hiveconfবা hivevarনামস্থান পরিবর্তনশীল সঞ্চয় করতে। এবং এই সমস্ত উত্তর সঠিক। তবে আরও একটি নামস্থান রয়েছে।

চলকগুলি namespacesধরে রাখার জন্য মোট তিনটি উপলব্ধ।

  1. hiveconf - এইচ দিয়ে এইচআইভি শুরু হয়েছিল, সমস্ত পোষাক কনফিগারেশন এই কনফের অংশ হিসাবে সঞ্চিত রয়েছে। প্রাথমিকভাবে, পরিবর্তনশীল প্রতিস্থাপন মুরগির অংশ ছিল না এবং এটি চালু হওয়ার সাথে সাথে সমস্ত ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলগুলি এর অংশ হিসাবেও সংরক্ষণ করা হয়েছিল। যা অবশ্যই ভাল ধারণা নয়। সুতরাং আরও দুটি নেমস্পেস তৈরি করা হয়েছিল।
  2. Hivevar : ব্যবহারকারীর ভেরিয়েবল সংরক্ষণ করতে
  3. সিস্টেম : সিস্টেম ভেরিয়েবল সংরক্ষণ করতে।

এবং তাই আপনি যদি কোনও প্রশ্নের কোনও অংশ হিসাবে (যেমন তারিখ বা পণ্য_সংখ্যা) কোনও ভেরিয়েবল সংরক্ষণ করে থাকেন তবে আপনার নাম স্থানটি 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};

7

আপনি কি ডলারের চিহ্ন এবং বন্ধনী ব্যবহার করার চেষ্টা করেছেন:

SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';

এটি আমার পক্ষে একমাত্র কার্যকরী উত্তর। আমার আম্বারি এইচআইভি ইন্টারফেসে উদ্ধৃতিগুলি প্রয়োজনীয়।
লরেন্স কোপ্পেনল

হিভেভার এবং হিভেকনফ দুটি জিনিস রয়েছে
রাহুল শর্মা

3

দুটি সহজ উপায়:

মধুচন্দী কনফ ব্যবহার করে

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+ পরিবর্তনশীল সাবস্টিটিউশন


2

একটি বিষয় মনে রাখবেন যে তারগুলি সেট করে তারপরে সেগুলি উল্লেখ করা। আপনাকে নিশ্চিত করতে হবে যে উদ্ধৃতিগুলি সংঘর্ষে নিচ্ছে না।

 set start_date = '2019-01-21';
 select ${hiveconf:start_date}; 

তারিখগুলি সেট করার পরে তারে কোডে উল্লেখ করে স্ট্রিংগুলি বিরোধ করতে পারে। এটি উপরের start_date সেট দিয়ে কাজ করবে না।

 '${hiveconf:start_date}'

কোয়েরিতে আবার উল্লেখ করার সময় স্ট্রিংয়ের জন্য দু'বার একক বা ডাবল উদ্ধৃতি সেট না করার বিষয়ে আমাদের সচেতন থাকতে হবে।


2

কেবলমাত্র যদি কারও কাছে ক্লাইমের মাধ্যমে এইচাই কোয়েরিকে প্যারামিটারাইজ করা দরকার।

যেমন:

hive_query.sql

SELECT * FROM foo WHERE day >= '${hivevar:CURRENT_DATE}'

এখন ক্লায়েন্ট থেকে উপরের স্কেল ফাইল চালাও:

hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql

0

এই পদ্ধতিটি ব্যবহার করে দেখুন:

set t=20;
select *
from myTable
where age > '${hiveconf:t}'; 

এটি আমার প্ল্যাটফর্মে ভাল কাজ করে।


0

আপনি শেল স্ক্রিপ্ট রফতানিতে চলকটি রফতানি করতে পারেন CURRENT_DATE = "2012-09-16"

তারপরে এইচআইকেএল-তে আপনি পছন্দ করুন * যেখানে থেকে দিন নির্বাচন করুন> = '$ {এনভি: CURRENT_DATE}'


-7

আপনি অন্য ক্যোয়ারীর আউটপুটটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন এবং পরবর্তীটি আপনি নিজের কোডটিতেও এটি ব্যবহার করতে পারেন:

set var=select count(*) from My_table;
${hiveconf:var};

আপনি ভুল, My_table থেকে গণনা (*) নির্বাচন করুন; ভারে সংরক্ষণ করা হবে ।
ইলিয়া বাইস্ট্রভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.