原始的SQL是INSERT xx OVERWRITE SELECT * FROM x
,从上面执行时的log看出字段与DDL里定义的没有对齐,由于SQL里SELECT时没有与DDL里的对齐,查文档得知,INSERT时字段的顺序必须与DDL的顺序相同,数量相同。
要求字段数量相同这个可以理解,要求字段顺序与DDL相同这一条,从Hive底层存储也是文件来看,倒也合理。但是从用户体验上来说,真得是不太理解。在INSERT的时候能否根据表的DDL来自动调整下SELECT的顺序呢。
根据DDL的信息:
- 可以推断字段数量是否一致;
- SELECT的值是否对应DDL中的字段,如果没有,可以提前给出错误提示。不用等执行完成了,还有字段值空着;
- 如果SELECT的字段做了AS操作,可以直接直接检查字段信息。
该优化可以减轻写SQL的负担,对于一个有几十个字段的表,靠人来保证顺序还是比较低效的。