Hive建表报错:ParseException语法不匹配问题咨询
嘿,我来帮你拆解这个Hive建表的语法错误,这几个坑其实挺常见的:
NOT NULL语法不符合Hive规范:Hive对字段约束的支持和传统关系型数据库不一样,你直接在字段类型后面加NOT NULL是行不通的——早期Hive版本完全不支持这个约束,就算是新版本,也得开启ACID模式才能有限支持,而且语法格式也不是这么写的。解析器看到NOT的时候完全懵了,因为它预期这里应该是字段定义的结束符号),所以直接抛出了匹配错误。带空格的字段名没加转义:你看
legal entity、glack account这些字段名里有空格,Hive要求这种带特殊字符(包括空格)的字段名必须用反引号`包裹起来,不然解析器会把空格后面的词当成新的语法元素,直接打乱整个语句的结构。LOCATION子句的位置写错了:你把
LOCATION放在了STORED AS TEXTFILE;之后,还多打了个分号,这会让Hive把LOCATION当成单独的语句来解析,肯定出错。正确的位置应该是在STORED AS TEXTFILE之后,不用提前加分号。
给你修正后的建表语句,你可以直接用:
CREATE TABLE daily_volume ( amble STRING, code STRING, prod_code STRING, `legal entity` STRING, country STRING, buile STRING, cost_center STRING, `glack account` STRING, inter STRING, `billing number` STRING, `account number` STRING, transaction TIMESTAMP, volume INTEGER ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '~' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/Eav/data/dev_ans_mns.db';
另外补充一句:如果你的业务场景确实需要NOT NULL约束,得先开启Hive的ACID支持(要改几个配置参数,比如hive.support.concurrency=true、hive.enforce.bucketing=true这些),然后用COLUMN CONSTRAINT ... NOT NULL的格式来定义,但说实话,Hive的NOT NULL大多是“装饰性”的,不会像MySQL那样强制校验数据,所以如果不是必须的话,直接去掉反而更省心。
内容的提问来源于stack exchange,提问作者Oye

