(本文档仅供参考)
问题说明:
Excel导入模板中,某个字段绑定导入当前登录的用户名,例如:管理员,导入后发现只导入了“管”。
原因:
Smartbi在导入数据时会执行标准的insert语句:insert into table value ( ...) 把数据插入到数据库,但是Impala数据库对此语法支持不好,导致导入的字符串会被截取。若是可以联系到维护厂商,让厂商从数据库上修复支持,这是最好的!
具体验证说明如下:
1、smartbi在回写数据时系统会拼接出以下格式的SQL,insert into table value ( ?,?,?) :['a','b','c']
2、驱动预编译处理SQL,获得以下格式,insert into table value ( 'a','b','c')
3、由于jdbc预处理生成的SQL,字符串数据都是用单引号引用的,如果是单引号impala会认为是字符类型char, 例如 '重庆航空',长度为4,char(4),但是每个中文占3个字节,所以只能存储1个半中文,所有会重现截断以及乱码的情况,而'重庆航空公司',长度为6,char(6),能存储2个完整的中文,因此会出现截断,而不会乱码。
规避方案:
规避方案1:经本地验证下图中的两种语法是不会发生截取的,若确认以下语法在实际的数据库环境中可解决截取问题,也可通过定制Smartbi的数据处理类的方式,改变原有的insert SQL的拼接方式来规避此数据库问题。
规避方案2:若impala底层是hive表,并且Hive是允许使用JDBC方式直接连接的,可以尝试把数据导入到底层的hive。(一般hive配置了允许impala连接,hive允许直连的可能性比较少,不建议采用此方式)
后续:
在2021-01-29后的V95版本,产品在构造SQL时用 cast '管理员' as string 方式来处理,已规避此问题,可更新版本解决。
评论
赵尉余 发表:
规避办法3:通过在url中增加OptimizedInsert=0,关闭驱动的插入优化功能
说明见:https://zhuanlan.zhihu.com/p/87960346