hadoop与hive的映射

hadoop与hive的映射

hadoop代码转向hive代码说到,很多MR任务可以由hive完成。这几天,作了一些简单的汇总:

1、文件切割(多输入多输出)
需求:数据LOG包含多种信息,需要将不同的数据信息重定向到不同的文件。
hadoop:MultipleInputs、multipleoutputs两个类主要负责多输入多输出的处理
hive:利用union all和Custom map/reduce scripts,可以对不同的输入进行不同的处理,然后合并结果;Multi Table/File Inserts、Dynamic-partition Insert这两个主要是对同个数据源(或者某个中间结果),根据条件重定向输出,特别是中间结果,可以减少很多MR Job。

2、获取文件的输入路径
需求:数据LOG可能包含日志服务器和日期信息,每个文件包含的是不同服务器、不同日期的数据。这个时候只能通过文件名区分数据的服务器、日期。
hadoop: ((FileSplit) reporter.getInputSplit()).getPath()
hive:hive建表时已经指定数据存储路径,只能通过元数据库获取。但是直到0.8.0版本之前,hive都一直没有提供相应的函数和接口。hive0.8.0提供了INPUT__FILE__NAME、BLOCK__OFFSET__INSIDE__FILE两个虚拟列,可以获取文件名和文件位置。我非常喜欢hive这些改进。hadoop之所以能够广泛使用,是因为提供的底层接口,让用户自定义处理;hive虽然提高了编写脚本的效率,但是功能毕竟有限。这就类似一些高级语言也会提供一些底层语言的语法,以适合不同的场景应用。

3、两表数据join
需求:数据信息不可能只保存在一个数据文件/数据中,实际工作经常需要关联多张表,才能完整获取文件信息。
hadoop: 分为map side join 和reduce side join两种。reduce side join的实现方式是在map阶段给数据源打标签,区分数据文件;然后在reduce阶段,获取来自多个文件的相同key的value, 然后对于同key,进行多个文件间的数据join。map side join是一种改进。如果关联的两个表,一个表非常大,而另一个表可以直接存放到内存中。这样,可以将可以放到内存的表直接复制到每个map,然后只需要扫描大表,关联数据即可。
hive:LEFT、RIGHT、FULL JOIN是常见的两表数据关联。而判断表A中的KEY是否在表B中,则需要用到LEFT SEMI JOIN

4、获取配置文件
需求:代码与配置文件是分离的,这样有变动的时候,只需要修改配置文件就能获得良好的扩展。
hadoop:DistributedCache 是Map/Reduce框架提供的功能,能够缓存应用程序所需的文件 (包括文本,档案文件,jar文件等)。DistributedCache.addCacheFile是相应实现
hive:add files jars archives

5、不同的数据不同的处理
hadoop:不同的输入文件可由不同的map函数处理MultipleInputs.addInputPath(JobConf conf, InputPath, TextInputFormat.class, Mapper.class)
hive:SELECT TRANSFROM(输入字段) USING '处理脚本‘ AS(输出字段) WHERE 根据条件筛选相应的数据 UNION ALL(归并不同处理脚本输出的数据)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值