配置单元变量串联

dxxyhpgq  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(473)

我在将变量的值与字符串连接起来时遇到了问题。我的脚本包含以下内容

set hivevar:tab_dt= substr(date_sub(current_date,1),1,10);

CREATE TABLE default.udr_lt_bc_${hivevar:tab_dt}
(
trans_id double 
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";

在上面的例子中,变量tab_dt以yyyymmdd格式正确地分配了昨天的日期。但是,当我尝试用静态字符串连接表名中的这个变量时,脚本失败了。它没有进行连接。请提供解决方案。
注意:我也尝试了下面的,这是错误的

set hivevar:tab_dt= substr(date_sub(current_date,1),1,10);
set hivevar:tab_nm1= default.udr_lt_bc_;
set hivevar:tab_name= concat(${hivevar:tab_dt},${hivevar:tab_nm1})

CREATE TABLE ${hivevar:tab_name}
(
trans_id double 
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";

这也返回了一个错误。

dly7yett

dly7yett1#

Hive中的另一种方式:

select concat("table_",date_sub(from_unixtime(unix_timestamp(current_date,'yyyy-MM-dd'),'yyyy-MM-dd'),0));

在这里,我们可以在变量中使用上面的内容,并根据需要使用它。

mdfafbf1

mdfafbf12#

hive不计算变量中的表达式,而是按原样替换它们。create table表达式的结果如下:

CREATE TABLE default.udr_lt_bc_substr(date_sub(current_date,1),1,10)...

第二个表达式的结果如下:

CREATE TABLE concat(substr(date_sub(current_date,1),1,10),default.udr_lt_bc_)

不幸的是,hive在ddl中不支持这样的表达式。
我建议在shell中计算这个变量,并将其作为--hivevar传递给配置单元脚本。
例如,在sell脚本中:

table_name=udr_lt_bc_$(date +'%Y_%m_%d' --date "-1 day")

# table_name is udr_lt_bc_2017_10_31 now

# call your script

hive -hivevar table_name="$table_name" -f your_script.hql

然后在您的脚本中可以使用变量:

CREATE TABLE default.${hivevar:table_name}

请注意 '-' 表名中不允许使用,这就是我使用 '_' 相反。
要更好地了解配置单元如何替换变量,请尝试以下操作:

hive> set hivevar:tab_dt= substr(date_sub(current_date,1),1,10);
hive> select ${hivevar:tab_dt};
OK
2017-10-31
Time taken: 1.406 seconds, Fetched: 1 row(s)
hive> select '${hivevar:tab_dt}';
OK
substr(date_sub(current_date,1),1,10)
Time taken: 0.087 seconds, Fetched: 1 row(s)

请注意,在第一个select语句中,变量被替换为执行前的状态,然后在sql中进行计算。第二个select语句阻止计算,因为变量被引用并保持原样: substr(date_sub(current_date,1),1,10) .

相关问题