【发布时间】:2021-09-05 20:48:53
【问题描述】:
我有一个 shell 脚本,用于将字符串变量解析到 Hive 中,以过滤我的观察结果。我在下面提供了脚本和配置单元代码。
在以下脚本中,我有一个具有字符串值的变量,我尝试将其解析为配置单元,如下示例:
Shell 脚本:
name1='"Maria Nash"' *(I use a single quote first and then a double)*
hive --hiveconf name=${name1} -f t2.hql
Hive 代码 (t2.hql)
create table db.mytable as
SELECT *
FROM db.employees
WHERE emp_name='${hivevar:name}';
结论
准确地说,最终表已创建,但不包含任何观察结果。 employees 表包含但 emp_name 为“Maria Nash”的观察结果。
我认为我可能无法从 shell 正确解析字符串,或者我没有遵循正确的语法来处理配置单元查询中的解析变量。
感谢您的帮助!
【问题讨论】:
-
你为什么用单引号+双引号。双引号就够了。当传递给 Hive 并且在 Hive 中添加单引号时,它们将被删除,这是正确的。还是您的 emp_name 包含双引号?
-
@leftjoin 请再次检查我的示例。我改变了它。我用“Maria Nash”之类的字符串替换了“Maria”。可能会有所不同。
-
引号由shell处理,但是当您在带引号的表达式中使用引号时,它们是字符串值的一部分,您可以使用例如
name1='Maria Nash'然后hive --hiveconf name="${name1}" -f t2.hql,双引号对于参数扩展很重要,问题是使用不带引号的name=${name1} -
@NahuelFouilleul 这是正确的答案。谢谢!
-
将此添加为 Hive 脚本的第一行:` ! echo emp_name='${hivevar:name}'` - 空格+!是从 Hive 执行的 shell 命令。这将打印您的参数