在Hive脚本中需要对保留字符进行转义且Hue窗口支持使用单引号与双引号,但是脚本中与Hue中的使用是有差别的
转义字符:
如下SQL,使用Hive中的函数进行字符串分割
select split('hello;hive;sql;hadoop',';')[0]
上述SQL在Hue窗口可以正常数据「hello」但是在Hive脚本中会报错
org.apache.hadoop.hive.ql.parse.ParseException: line 1:19 cannot recognize input near 'hello' '<EOF>' '<EOF>' in select expression at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:204) at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166) at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:522) at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1356) at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1473) at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1285) at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1275) at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:226) at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:175) at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:389) at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:324) at org.apache.hadoop.hive.cli.CliDriver.processReader(CliDriver.java:422) at org.apache.hadoop.hive.cli.CliDriver.processFile(CliDriver.java:438) at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:732) at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699) at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:634) at org.apache.oozie.action.hadoop.HiveMain.runHive(HiveMain.java:333) at org.apache.oozie.action.hadoop.HiveMain.run(HiveMain.java:310) at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:81) at org.apache.oozie.action.hadoop.HiveMain.main(HiveMain.java:71) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:235) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
应该加转义:
select split('hello\;hive\;sql\;hadoop','\;')[0]
关于引号的使用
INSERT INTO test_table2
SELECT CASE
WHEN "true"= "true" THEN TRUE
WHEN "false"= "false" THEN FALSE
END
上述SQL中 「test_table2」只有一列且类型是Boolean ,目的是将字符串类型的「TRUE」「FALSE」转换为Boolean类型。
同样在Hue窗口中执行后可以在「test_table2」中查询到改记录,但是在脚本中的执行后表中该列为NULL,改为单引号才能正确得到结果。