web-dev-qa-db-ja.com

Hiveqlを使用したループ

2つのデータセット、たとえばAとBをマージしようとしています。データセットAには、2つの値を取る変数「フラグ」があります。両方のデータを一緒にマージするのではなく、「フラグ」変数に基づいて2つのデータセットをマージしようとしました。

マージするコードは次のとおりです。

create table new_data as
select a.*,b.y
from A as a left join B as b
on a.x=b.x

私はCLIを介してHiveコードを実行しているので、次のコマンドを使用してこれを呼び出しています

Hive -f new_data.hql

「Flag」変数に基づいてデータをマージするために呼び出しているコードのループ部分は次のとおりです。

for flag in 1 2;
do
  Hive -hivevar flag=$flag -f new_data.hql
done

上記のコードを別の「.hql」ファイルに入れて呼び出します。

Hive -f loop_data.hql

しかし、それはエラーを投げています。

「for」「flag」「in」の近くの入力を認識できません

誰が私が間違っているのか教えてください。

ありがとう!

6
Beta
  1. ループロジックをシェルスクリプトに追加する必要があります。

ファイル名:loop_data.sh

for flag in 1 2;
do
  Hive -hivevar flag=$flag -f new_data.hql
done

次のようにスクリプトを実行します。

sh loop_data.sh
  1. New_data.hqlスクリプトで、テーブルを作成しています。 DDLとDMLを2つの別々のスクリプトに分割する必要があるため。お気に入り

DDL:create_new_data.hql

create table new_data as
select 
  a.*,
  b.y
from 
  A as a left join 
  B as b on 
  a.x = b.x
where 
  1 = 0;

DML:insert_new_data.hql

insert into new_data 
select 
  a.*,
  b.y
from 
  A as a left join 
  B as b on 
  a.x = b.x
where
  flag = ${hiveconf:flag}

次のようにシェルスクリプトを更新します。

ファイル名:loop_new_data.sh

# Create table
Hive -f create_new_data.hql

# Insert data
for flag in 1 2;
do
  Hive -hiveconf flag=$flag -f insert_new_data.hql
done

そしてそれを次のように実行します:

sh loop_new_data.sh

詳細が必要な場合はお知らせください。

9
Ambrish