首页 > 解决方案 > 从脚本传递的 Beeline/Hive2 变量被截断

问题描述

我有一个脚本,我从中将参数传递给 hive 变量。整个流程如下。hive 变量之一被截断。

猫 << 脚本.sh

beeline -u "$HIVESERVER" \
-f $path_to.hql \
--hivevar TRGT_DB=$HIVE_TRGT_DB \
--hivevar SRC_CLMN=$SOURCE_CLMNS \
--hivevar INBND_DB=$HIVE_SRC_DB \
--hivevar SRC_TBL=$SOURCE_TABLE \
--hivevar TRGT_TBL=$TRGT_TABLE \

除了被截断的列变量(SRC_CLMN)外,所有变量都正确传递

SRC_CLMN 是从如下文件中提取的。

SRC_CLMN=`cat source_column.tbl | grep table | (some sed functions)`

SRC_CLMN 变量的输出:

trim(regexp_replace(col1, '[^a-zA-Z]', '')) as col1,trim(col2) as col2,trim(regexp_extract(col1,"\(([^)]+)\)" , 1)) as col3,trim(col4) as col4,trim(col5) as col5,trim(col6) as col6,'' as col7,trim(col8) as col8,trim(col9) as col9,trim(col10 ) 作为 col10,trim(col11) 作为 col11,trim(col12) 作为 col12,trim(col13) 作为 col13

当我打印变量时,它正在打印整个字符串。

但是当我使用 SET SRC_CLMN 打印配置单元变量时;我只看到“修剪(regexp_replace(col1,”

所以这会在配置单元查询中引发错误。

标签: shellhivebeeline

解决方案


SRC_CLMN 变量的输出:

trim(regexp_replace(col1, '[^a-zA-Z]', ' ')) as col1,trim(col2) as col2,trim(regexp_extract(col1,"(([^)]+))", 1 )) as col3,trim(col4) as col4,trim(col5) as col5,trim(col6) as col6,'' as col7,trim(col8) as col8,trim(col9) as col9,trim(col10) as col10,trim(col11) 作为 col11,trim(col12) 作为 col12,trim(col13) 作为 col13

正如您在输出中看到的那样,有单引号 '[^a-zA-Z]', ' ')) 您必须使用跳过字符才能使它们在您的字符串中可用

这就是变量保存它的方式 SRC_CLMN= 'trim(regexp_replace(col1, ' [^a-zA-Z]', ' ')) as col1,trim(col2) as col2,trim(regexp_extract(col1,"(( [^)]+))", 1)) as col3,trim(col4) as col4,trim(col5) as col5,trim(col6) as col6,'' as col7,trim(col8) as col8,trim( col9) 作为 col9,trim(col10) 作为 col10,trim(col11) 作为 col11,trim(col12) 作为 col12,trim(col13) 作为 col13

如果您检查我标记的粗斜体部分,您会看到它以引号开头并以引号结尾,因此对于变量就是字符串

您需要处理所有带有跳过字符的引号,您可以使用sed来替换所有 ' 并添加跳过字符 \'


推荐阅读