Hive插入数据时带T格式日期变量报语法识别错误求助
问题原因
报错和Hive是否支持T字符无关,核心是两个写法问题导致HQL语法解析失败:
- HQL中引用替换变量时没有给字符串值加单引号。你生成的
date_temp是类似2024-05-15T16:57:00的字符串,直接替换到SQL里之后会变成select f1,f2,2024-05-15T16:57:00,...,Hive会把无引号的内容当成语法标识符/数值表达式解析,碰到T、冒号这类不符合语法规则的字符就会抛出解析错误。 - Shell变量定义语法错误,等号两侧不能加空格,否则Shell会把变量名识别成要执行的命令,根本没法正确赋值。
修复步骤
- 修正HQL脚本File.hql,给所有字符串类型的变量替换位加单引号,同时补全insert语法缺失的关键字,修改后内容如下:
-- 如果是覆盖分区写就把into换成overwrite insert into table db1.tb1 partition (dt_p= '${dt_p}') select f1, f2, '${date_temp}', '${dt_p}' from db2.tb1
注意:分区字段dt_p如果是字符串类型,赋值时也必须加单引号,否则容易出现隐式类型转换导致的分区异常。
- 修正Shell脚本中的变量赋值语句,去掉等号两侧的空格,同时修正日期格式串的笔误(你原来的格式串里%m和%d之间漏了横杠,会导致月日连在一起),正确写法:
# 等号两边绝对不能加空格 date_temp=$(date -d "$1" +%Y-%m-%dT%H:%M:%S)
效果验证
修复后变量替换完成的HQL是标准合法语法:
insert into table db1.tb1 partition (dt_p= '2024-05-15') select f1, f2, '2024-05-15T16:57:00', '2024-05-15' from db2.tb1
单引号包裹的带T的时间字符串会被Hive识别为普通字符串常量,完全符合date_temp字段的string类型要求,不会再抛出解析错误。
内容的提问来源于stack exchange,提问作者tamo007
相关产品推荐
相关产品推荐

