2016-05-02 58 views
0

这是我在shell脚本中的配置单元查询。它所做的是从文本文件中一次读取一个表名,然后运行hive查询以将行插入到其中。Hive查询传递字符串作为参数

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

蜂巢查询

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 

回答

0

我会把蜂巢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 

希望这将有助于

+0

执行它我得到此错误 - 执行hive查询时发生错误:编译语句时出错:FAILED:ParseException行2:40无法识别'*''附近的输入'我'*'在选择目标 – snate

+0

可以添加'(cat ../ hive/ListofTableNames.txt'的输出吗? – user1314742

+0

当我把查询移动到一个单独的文件,就像你刚才提到的那样,我用'I'**替换了'I'** '它工作了,感谢你的帮助。 – snate

0

我会尝试

  1. SQL写入一个文件,并使用--hivevar选项的变量传递给HQL 蜂巢--hivevar I = BB -f your.hql
  2. 从脚本写入sql到tmp文件,运行hive -f
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。并使用-f filename.ql如user1314742

相关问题