使用Hiveql循环

Bet*_*eta 6 hive hiveql

我正在尝试合并2个数据集,例如A和B.数据集A有一个变量"Flag",它取2个值.我试图根据"flag"变量合并2个数据集,而不是将两个数据合并在一起.

合并代码如下:

create table new_data as
select a.*,b.y
from A as a left join B as b
on a.x=b.x
Run Code Online (Sandbox Code Playgroud)

由于我通过CLI运行Hive代码,我通过以下命令调用它

hive -f new_data.hql
Run Code Online (Sandbox Code Playgroud)

我正在调用基于"Flag"变量合并数据的代码的循环部分如下:

for flag in 1 2;
do
  hive -hivevar flag=$flag -f new_data.hql
done
Run Code Online (Sandbox Code Playgroud)

我将上面的代码放在另一个".hql"文件中,因为它调用它:

hive -f loop_data.hql
Run Code Online (Sandbox Code Playgroud)

但这是错误的投掷.

无法识别'for''flag''附近的输入''

任何人都可以告诉我我在哪里弄错了.

谢谢!

Amb*_*ish 9

  1. 您应该将循环逻辑添加到shell脚本中.

文件名:loop_data.sh

for flag in 1 2;
do
  hive -hivevar flag=$flag -f new_data.hql
done
Run Code Online (Sandbox Code Playgroud)

并执行以下脚本:

sh loop_data.sh
Run Code Online (Sandbox Code Playgroud)
  1. 在new_data.hql脚本中,您正在创建表.因为您应该在2个单独的脚本中拆分DDL和DML.喜欢

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;
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

并更新你的shell脚本,如:

文件名: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
Run Code Online (Sandbox Code Playgroud)

并执行它:

sh loop_new_data.sh
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多信息,请告诉我.

  • 上述解决方案适用于命令行,但我在 hive shell 上使用 hive 查询 (2认同)