在 Hive 里创建 ORC 表,是不是经常遇到各种报错?有时候明明照着教程敲的代码,结果屏幕上一堆红色错误提示,看得人头皮发麻。小编刚开始学的时候也这样,光是创建一个简单的 ORC 表,就踩了好几个坑。今天就把这些常见错误和解决方法整理出来,新手朋友们看完,说不定能少走很多弯路,一起往下看吧!
错误 1:语法写错了,关键字拼错或格式不对
这是最容易犯的错,尤其是新手。比如创建 ORC 表的时候,少个逗号、关键字拼错,都会导致报错。
有次小编想写 “stored as orc”,结果手滑写成了 “store as orc”,系统直接报错 “FAILED: ParseException line 1:XX missing EOF at ‘as’ near’store’”。当时还以为是哪里出了大问题,后来才发现是 “stored” 少了个 “d”。
还有种情况是字段后面没加逗号,比如 “id int name string”,中间少了逗号,也会报错。解决方法很简单,仔细检查代码,特别是关键字拼写和标点符号,最好写完后逐字核对一遍。网友小王说:“我现在创建表前,都会把关键字复制粘贴,就怕拼错,省了不少事。”
错误 2:数据类型不兼容,ORC 不支持某些类型
ORC 格式对数据类型有自己的要求,有些 Hive 支持的类型,ORC 可能不支持,或者支持得不好。比如 “timestamp with local time zone” 这种类型,在 ORC 表中就容易报错。
小编之前试过创建一个包含 “timestamp with local time zone” 字段的 ORC 表,结果提示 “Unsupported data type: timestamp with local time zone”。后来把字段类型改成普通的 “timestamp”,表就创建成功了。
另外,复杂类型比如 “map” 的嵌套层数太多,ORC 也可能处理不了。遇到这种情况,要么简化数据类型,要么把复杂字段拆分成多个简单字段。要是不确定 ORC 支持哪些类型,可以查 Hive 的官方文档,里面列得很清楚。
错误 3:SerDe 类指定错误,ORC 有专属 SerDe
创建 ORC 表时,有时候需要指定 SerDe 类(序列化 / 反序列化类),但如果指定错了,就会创建失败。ORC 有自己默认的 SerDe 类,一般是 “org.apache.hadoop.hive.ql.io.orc.OrcSerde”。
有个网友分享,他创建 ORC 表时,误把 SerDe 类写成了 “org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe”(这是文本格式常用的),结果报错 “SerDe class not found”。改成 ORC 专属的 SerDe 类后,问题就解决了。
其实如果不是特殊需求,创建 ORC 表时可以不用手动指定 SerDe 类,Hive 会自动使用默认的,这样能减少出错的概率。小编建议新手朋友,刚开始创建 ORC 表时,先不指定 SerDe,等熟悉了再说。
错误 4:权限不够,HDFS 路径没权限写
创建 ORC 表时,Hive 会在 HDFS 上创建对应的目录来存储数据,如果当前用户没有这个目录的写入权限,就会报错 “Permission denied: user=xxx, access=WRITE”。
这种情况该怎么办呢?可以让管理员给你授权,或者自己换一个有权限的路径。比如创建表时指定 “location ‘/user/yourname/orc_table’”,确保 “/user/yourname” 这个目录你有权限写。小编之前就因为用了默认路径没权限,后来改成自己用户名下的路径,就顺利创建表了。
还有种可能是 HDFS 上的目录已经存在,而且权限不对,这时候可以先删除那个目录(谨慎操作,别删错了),再重新创建表。
错误 5:Hive 版本太低,不支持 ORC 的新特性
如果你的 Hive 版本比较老,可能不支持 ORC 的一些新特性。比如 Hive 0.11 之前的版本,对 ORC 的支持不完善,创建表时可能会出现各种奇怪的错误。
网友小李用的 Hive 0.10 版本,创建 ORC 表时一直报错,换了好几种写法都不行。后来把 Hive 升级到 0.14 版本,不用改代码就创建成功了。所以如果你的 Hive 版本太老,又经常遇到 ORC 相关的错误,不妨考虑升级一下版本。
当然,升级前要备份好数据,别因为升级导致数据丢失,那就麻烦了。
小编的一点小建议
创建 Hive ORC 表时遇到错误,别着急,先看看报错信息里的关键词,比如 “ParseException” 大概率是语法错了,“Permission denied” 就是权限问题。对着关键词找原因,解决起来会快很多。
另外,新手可以先从最简单的 ORC 表创建开始,比如只包含几个基本字段(int、string、timestamp),成功后再慢慢增加复杂度。多试几次,熟悉了 ORC 表的特性,很多错误自然就能避免了。希望这些方法能帮到你,下次创建 ORC 表顺顺利利的!