【问题标题】:Hive query passing string as an argumentHive 查询将字符串作为参数传递
【发布时间】:2016-08-27 16:33:36
【问题描述】:

这是我在 shell 脚本中的配置单元查询。它的作用是一次从文本文件中读取一个表名并运行配置单元查询以将行插入其中。

当我用整数值 1 替换“I”时,它可以正常工作。尝试了几种方法来传递“我”,但它不起作用。任何帮助表示赞赏。

Hive 查询

for line in $(cat ../hive/ListofTableNames.txt);

do

 eval "hive -e 'SET hive.exec.dynamic.partition.mode=nonstrict;

 FROM sourcedb.$line

 INSERT OVERWRITE TABLE targetdb.$line

 SELECT from_unixtime(unix_timestamp()),**'I'**,*;'"

done

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    我会将 hive QL 放在一个文件中,比如说 myRequest.ql:

    SET hive.exec.dynamic.partition.mode=nonstrict;
    FROM sourcedb.${hiveconf:tableName}
    INSERT OVERWRITE TABLE targetdb.${hiveconf:tableName}
    SELECT from_unixtime(unix_timestamp()),**'I'**,*;'"
    

    然后你的脚本会是这样的:

    for line in $(cat ../hive/ListofTableNames.txt);
    
    do
        eval "hive --hiveconf tableName=$line -f myRequest.ql"
    done
    

    希望对你有所帮助

    【讨论】:

    • 我收到此错误 - 执行 hive 查询时出错:编译语句时出错:FAILED:ParseException line 2:40 cannot identify input near '' 'I' '' in选择目标
    • 可以添加(cat ../hive/ListofTableNames.txt的输出吗?
    • 在我将查询移动到您提到的单独文件后,我将 'I' 替换为仅 'I' 并且它起作用了。感谢您的帮助。
    【解决方案2】:

    我会试试的

    1. 将 SQL 写入文件并使用 --hivevar 选项将变量传递给 HQL hive --hivevar I=BB -f your.hql
    2. 从脚本写sql到tmp文件,运行hive -f

    【讨论】:

      【解决方案3】:

      您需要在查询中转义单引号。

      for line in $(cat ../hive/ListofTableNames.txt);
      do
       eval "hive -e 'SET hive.exec.dynamic.partition.mode=nonstrict;
       FROM sourcedb.$line
       INSERT OVERWRITE TABLE targetdb.$line
       SELECT from_unixtime(unix_timestamp()),**\'I\'**,*;'"
      done
      

      由于SET操作之前有一个单引号,所以它将下一个引号作为结束引号。因此,为避免此类情况,请始终使用转义字符。

      另一个巧妙的选择是将查询写入单独的文件并保存为 query.ql。并按照 user1314742 的建议使用-f filename.ql 执行它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多