hive多分隔符

hive多分隔符,第1张

hive在建表时,通常使用

ROW FORMAT DELIMITED

FIELDS TERMINATED BY "|#" 来限定数据中各个字段的分隔符,这种方式只支持单个分隔符,即:实际只会按照"|"进行分割,若想实现支持多分隔符,有如下几种方式:

1、hive从0.14版本以后支持MultiDelimitSerDe,可以比较优雅多解决多分隔符问题

ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' WITH SERDEPROPERTIES ("field.delim"="|#")

参考: https://cwiki.apache.org/confluence/display/Hive/MultiDelimitSerDe

2、使用RegexSerDe,需要写正则表达式

3、重写 InputFormat 中 RecordReader 类中的 next 方法,重写完成后打包成jar,放入到Hive目录的lib文件夹下面。创建表的时候再指定INPUTFORMAT

之后遇到的问题:

1、执行查询、join时报错:Class org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe not found

根据网上的方案1:进入hive执行add jar /usr/hdp/3.1.5.0-152/hive/lib/hive-contrib.jar

又报了如下的错误:

does not have following privileges for operation ADD [ADMIN] (state=,code=1)

根据网上的方案2:在hive-site.xml中添加如下配置,重启hive服务还是不生效

<property>

<name>hive.aux.jars.path</name>

<value>file:///usr/hdp/3.1.5.0-152/hive/lib/hive-contrib.jar</value>

</property>

问题先记下来后续有时间再解决 ,这里通过对源文件进行逐行处理,将多分隔符"|#"中的"#"替换为空字符,从而变成单分隔符

sed 's/#//g' data.txt >new_data.txt

一、故障情景

基于Hive的数据仓库中需要做一张累积快照表,记录了客户发生各个行为的具体日期,比如激活日期、注册日期、申请日期、创建订单日期等等。

这张表需要以激活日期作为分区时间,便于业务查询。

激活日期将近500个日期,在一次性将所有数据全量插入目标分区的时候所有reduce报OOM。

二、解决过程

首先增加reduce端的内存,set mapreduce.reduce.java.opts = -Xmx3072m;set mapreduce.reduce.memory.mb = 3072;最后将内存设置到集群最高内存,仍然报OOM。

再分析源数据的分类,发现源数据存在以前的测试数据,这样会造成有的分区日期只有一条数据,有的分区天数有几十万数据,数据存在严重的倾斜。

解决方法有两种。

第一种在HQL末尾加上distribute by和sort by,或者cluster by。如下:

insert overwrite table loan_f_milestone partition(day)

select *,

to_date(atv_tim)

from loan_f_milestone_tmp12

distribute by to_date(atv_tim)

sort by to_date(atv_tim)

--cluster by to_date(atv_tim)

distribute by按照指定的字段将数据划分到不同的输出reduce中,可以保证每个reduce处理的数据范围不重叠,每个分区内的数据是没有排序的。

sort by保证一个reduce内的数据按照指定字段排序。

cluster by除了有distribute by的功能,还有sort by的功能,所以最终的结果是每个reduce处理的数据范围不重叠,而且每个reduce内的数据按照指定字段排序,而且可以做到全局排序。

所以第二种方式是设置set hive.optimize.sort.dynamic.partition=true;会将动态分区字段全局排序。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11629986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存