HIVE如何入库多分隔符文件(含如何处理发现不了JAR包情况)
这个星期接到一个入库HIVE的需求,需求里文件是采用@@@分隔符分隔的,以前入库文件大都是单个分隔符,没想太多所以建表时候还是照往常分隔符方式建了。
fields terminated by '@@@'
结果入库完,HIVE表查出来数据错位了,看着像用一个@分隔出来的,DESC FORMATTED TABLE_NAME 看了下表结构,分隔符确实写着@@@。
当时就意识到可能正常的建表无法处理多分隔符的情况,想起最近在看的HIVE编程指南,可能得用序列化器了,多分隔符可以用两种序列化器MultiDelimitSerDe和RegexSerDe,第二种采用的正则表达式的形式比较麻烦,于是用了第一种。
建表语句
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="@@@")
NULL DEFINED AS ''
STORED AS TEXTFILE;
建表以后,试了下入库,入库正常,字段正确了,想看看入库记录数,于是用了SELECT COUNT(*),结果:
找不到类?奇怪啊,明明入库成功了,查询也正常啊。后来,思考了下,是不是转化成MAPREDUCE的任务要用到JAR包才找不到类?于是尝试了几个不需要转化为MAPREDUCE的SQL语句,都正常执行了,看来是找不到JAR包的问题。上网查了查:
看图片意思是要增加hive-contrib jar包进类路径,然后我在HIVE目录下lib里找到了这个JAR包,
/hive/lib/hive-contrib-1.2.1.jar
进入HIVE-SHELL,add jar jar包路径,再查询,正常运行,这种方式是每次进入HIVE-SHELL都要执行一次,退出重入后失效。如果我把这条命令加到入库脚本里,这样就可以在每次入库以后正确稽核入库条数了,但是后期要数据加工怎么办,每个脚本都要加,感觉很麻烦。直接加到配置文件里吧。HIVE目录下conf里hive-site.xml加入配置:
<property>
<name>hive.aux.jars.path</name>
<value>file:///opt/hhh/ccc/hive/lib/hive-contrib-1.2.1.jar</value>
</property>
重启HIVE-SHELL,执行select cont(*)语句,还是无法发现类,怎么回事我已经配置文件里面配置好了。在网上查了好久都没找到解决办法,基本都是配置好就能用了,这台HIVE客户端是别人装的,是不是装的时候少了什么变量的配置呢?看了下没有配置HIVE环境变量,于是增加了HIVE环境变量的配置,家目录下
vim .bashrc
增加路径后,
source .bashrc
重试一边,依旧找不到类。
翻翻hive目录下的conf文件夹,查看了下hive-env.sh,在里面最后一行发现一条这样的配置
原来在这里!,把这行注释去掉,给改成:
进入HIVE-SHELL,测试成功,完美!
总结一下,只需要hive-site.xml
<property>
<name>hive.aux.jars.path</name>
<value>file:///opt/hhh/ccc/hive/lib/hive-contrib-1.2.1.jar</value>
</property>
和hive-env.sh
export HIVE_AUX_JARS_PATH
配置好即可