【问题标题】:Hive variable concatenationHive 变量串联
【发布时间】:2017-11-01 06:26:00
【问题描述】:

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

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 ",";

这也是返回错误。

【问题讨论】:

    标签: variables hive concatenation


    【解决方案1】:

    Hive 不会计算变量中的表达式,而是按原样替换它们。 您的创建表表达式会导致:

    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 传递给 hive 脚本。

    例如在销售脚本中:

    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
    

    然后在 your_script 你可以使用变量:

    CREATE TABLE default.${hivevar:table_name}
    

    注意'-' 不允许出现在表名中,这就是我改用'_' 的原因。

    为了更好地理解 Hive 如何替换变量,试试这个:

    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)

    【讨论】:

    • 感谢 leftjoin 的详细评论。
    • 感谢 leftjoin 的详细评论。发现它很有帮助。事实上,我确实在 shell 脚本中尝试过,当我从命令行执行 sh 文件时它运行良好。但是当我从 oozie 工作流中调用同一个文件时,sh 文件中的 hive 部分没有运行。我的蜂巢查询与您提到的完全相似。我在 shell 脚本中分配了变量,然后在与 hive -hivevar table_name="$table_name" -f your_script.hql 相同的脚本中调用 hive。然后我将这个 .sh 文件作为 oozie 中的 shell 操作执行。你知道为什么会这样吗?
    • @Sandeep 我建议你用你的脚本和 oozie 配置再发布一个问题
    • 谢谢你我会做那个leftjoin
    【解决方案2】:

    Hive 中的另一种方式:

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

    在这里,我们可以在变量中使用 above 并根据需要使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多