电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

Hive多字节分隔符解决方案

  • 资源ID:265417138       资源大小:1.11MB        全文页数:26页
  • 资源格式: DOCX        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

Hive多字节分隔符解决方案

       Hive多字节分隔符解决方案                      目录1 应用场景1.1 Hive中的分隔符1.2 特殊数据2 问题与需求2.1问题2.2 情况二:数据中包含了分隔符3 解决方案3.1 解决方案一:替换分隔符3.2 解决方案二:RegexSerDe正则加载3.3 解决方案三:自定义InputFormat4 总结1 应用场景1.1 Hive中的分隔符Hive中默认使用单字节分隔符来加载文本数据,例如逗号、制表符、空格等等,默认的分隔符为001。根据不同文件的不同分隔符,我们可以通过在创建表时使用 row format delimited fields terminated by 单字节分隔符 来指定文件中的分割符,确保正确将表中的每一列与文件中的每一列实现一一对应的关系。1.2 特殊数据在实际工作中,我们遇到的数据往往不是非常规范化的数据,例如我们会遇到以下的两种情况· 情况一:每一行数据的分隔符是多字节分隔符,例如:”|”、“-”等上图中每列的分隔符为|,为多字节分隔符· 情况二:数据的字段中包含了分隔符上图中每列的分隔符为空格,但是数据中包含了分割符,时间字段中也有空格192.168.88.134 08/Nov/2020:10:44:32 +0800 "GET / HTTP/1.1" 404 9512 问题与需求2.1问题基于上述的两种特殊数据,我们如果使用正常的加载数据的方式将数据加载到表中,就会出以下两种错误:· 情况一:加载数据的分隔符为多字节分隔符创建表-如果表已存在就删除表 drop table if exists singer; -创建表 create table singer( id string,-歌手id name string,-歌手名称 country string,-国家 province string,-省份 gender string,-性别 works string-作品 ) -指定列的分隔符为| row format delimited fields terminated by '|'  加载数据load data local inpath '/export/data/test01.txt' into table singer; 查看结果select * from singer;问题数据发生了错位,没有正确的加载每一列的数据原因Hive中默认只支持单字节分隔符,无法识别多字节分隔符2.2 情况二:数据中包含了分隔符创建表-如果表存在,就删除表 drop table if exists apachelog; -创建表 create table apachelog( ip string, -IP地址 stime string, -时间 mothed string, -请求方式 url string, -请求地址 policy string, -请求协议 stat string, -请求状态 body string -字节大小 ) -指定列的分隔符为空格 row format delimited fields terminated by ' '加载数据load data local inpath '/export/data/apache_web_access.log' into table apachelog查看结果select * from apachelog;问题时间字段被切分成了两个字段,后面所有的字段出现了错位原因时间数据中包含了分隔符,导致Hive认为这是两个字段,但实际业务需求中,为一个字段需求基于上面两种情况的测试发现,当数据中出现了多字节分隔符或者数据中的某个字段包含了分隔符,就会导致数据加载错位的问题。基于出现的问题,我们需要通过特殊的方法来解决该问题,即使当数据中出现多字节分隔符等情况时,Hive也能正确的加载数据,实现列与数据的一一对应。3 解决方案3.1 解决方案一:替换分隔符方案概述面对情况一,如果数据中的分隔符是多字节分隔符,可以使用程序提前将数据中的多字节分隔符替换为单字节分隔符,然后使用Hive加载,就可以实现正确加载对应的数据。例如:原始数据中的分隔符为“|” 程序开发可以在ETL阶段通过一个MapReduce程序,将“|”替换为单字节的分隔符“|”,示例程序如下:import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; import java.io.IOException; /* * ClassName ChangeSplitCharMR * Description TODO MapReduce实现将多字节分隔符转换为单字节符 * Create By itcast */ public class ChangeSplitCharMR extends Configured implements Tool public int run(String arg) throws Exception /* * 构建Job */ Job job = Job.getInstance(this.getConf(),"changeSplit"); job.setJarByClass(ChangeSplitCharMR.class); /* * 配置Job */ /input:读取需要转换的文件 job.setInputFormatClass(TextInputFormat.class); Path inputPath = new Path("datas/split/test01.txt"); FileInputFormat.setInputPaths(job,inputPath); /map:调用Mapper job.setMapperClass(ChangeSplitMapper.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(NullWritable.class); /reduce:不需要Reduce过程 job.setNumReduceTasks(0); /output job.setOutputFormatClass(TextOutputFormat.class); Path outputPath = new Path("datas/output/changeSplit"); TextOutputFormat.setOutputPath(job,outputPath); /* * 提交Job */ return job.waitForCompletion(true) ? 0 : -1; /程序入口 public static void main(String args) throws Exception /调用run Configuration conf = new Configuration(); int status = ToolRunner.run(conf, new ChangeSplitCharMR(), args); System.exit(status); public static class ChangeSplitMapper extends Mapper<LongWritable,Text,Text,NullWritable> /定义输出的Key private Text outputKey = new Text(); /定义输出的Value private NullWritable outputValue = NullWritable.get(); Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException /获取每条数据 String line = value.toString(); /将里面的|转换为| String newLine = line.replaceAll("|", "|"); /替换后的内容作为Key this.outputKey.set(newLine); /输出结果 context.write(this.outputKey,this.outputValue); 程序执行结果如下: 重新建表加载数据1. 重新创建Hive表-如果表已存在就删除表drop table if exists singer;-创建表create table singer( id string,-歌手id name string,-歌手名称 country string,-国家 province string,-省份 gender string,-性别 works string-作品)-指定列的分隔符为|row format delimited fields terminated by '|'在Hive中重新加载数据load data local inpath '/export/data/part-m-00000' into table singer;查看结果 总结在ETL阶段可以直接对数据进行分隔符的替换,通过替换分隔符将多字节分隔符更改为单字节分隔符,就可以解决数据加载的问题,但是这种方式有对应的优缺点,并不是所有的场景适用于该方法。优点:实现方式较为简单,基于字符串替换即可缺点:无法满足情况2的需求 3.2 解决方案二:RegexSerDe正则加载· 1 方案概述面对情况一和情况二的问题,Hive中提供了一种特殊的方式来解决,Hive提供了一种特殊的Serde来加载特殊数据的问题,使用正则匹配来加载数据,匹配每一列的数据。官网地址:https:/cwiki.apache.org/conflu

注意事项

本文(Hive多字节分隔符解决方案)为本站会员(ji****81)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.