shell - 从脚本传递的 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,”
所以这会在配置单元查询中引发错误。
解决方案
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来替换所有 ' 并添加跳过字符 \'