Hive查询将字符串作为参数传递

时间:2016-05-02 19:43:48

标签: hadoop hive

这是我在shell脚本中的hive查询。它的作用是一次从文本文件中读取一个表名,然后运行hive查询将行插入其中。

当我更换'我'用整数值表示1,它工作正常。尝试过几种方法来通过'我'但它不起作用。任何帮助表示赞赏。

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

3 个答案:

答案 0 :(得分:0)

我会尝试

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

答案 1 :(得分:0)

我会将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

希望有所帮助

答案 2 :(得分:0)

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

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执行