Hive中自定义Map/Reduce示例 In Java

前端之家收集整理的这篇文章主要介绍了Hive中自定义Map/Reduce示例 In Java前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Hive支持自定义map与reduce script。接下来我用一个简单的wordcount例子加以说明。

如果自己使用Java开发,需要处理System.in,System,out以及key/value的各种逻辑,比较麻烦。有人开发了一个小框架,可以让我们使用与Hadoop中map与reduce相似的写法,只关注map与reduce即可。如今此框架已经集成在Hive中,就是$HIVE_HOME/lib/hive-contrib-2.3.0.jar,hive版本不同,对应的contrib名字可能不同。

  1. 开发工具:intellij
  2. JDK:jdk1.7
  3. hive:2.3.0
  4. hadoop:2.8.1

一、开发map与reduce

  1. map
  2. public class WordCountMap {
  3. static void main(String args[]) throws Exception{
  4. new GenericMR().map(System.in,System.out,new Mapper() {
  5. @Override
  6. void map(String[] strings,Output output) Exception {
  7. for(String str:strings){
  8. String[] strs=str.split("\\W+");//如果源文本文件是以\t分隔的,则不需要再拆分,传入的strings就是每行拆分好的单词
  9. (String str_2:strs) {
  10. output.collect(new String[]{str_2,"1"});
  11. }
  12. }
  13. }
  14. });
  15. }
  16. }
  17. "reduce类
  18. WordCountReducer {
  19. new GenericMR().reduce(System.in,1)"> Reducer() {
  20. @Override
  21. void reduce(String s,Iterator<String[]> iterator,1)">int sum=0;
  22. while(iterator.hasNext()){
  23. Integer count=Integer.valueOf(iterator.next()[1]);
  24. sum+=count;
  25. }
  26. output.collect( String[]{s,String.valueOf(sum)});
  27. }
  28. });
  29. }
  30. }

 

二、导出jar包

然后导出Jar包(包含hive-contrib-2.3.0),假如导出jar包名为wordcount.jar

 

File->Project Structure
 

 
add Artifacts

 

 

不用填写Main Class,直接点击OK
 

 

jar包配置

 

 

生成jar包
 

三、编写hive sql

  1. drop table if exists raw_lines;
  2. -- create table raw_line,and read all the lines in '/user/inputs',this is the path on your local HDFS
  3. create external table if not exists raw_lines(line string)
  4. ROW FORMAT DELIMITED
  5. stored as textfile
  6. location ;
  7. drop table exists word_count;
  8. -- create table word_count,this is the output table which will be put /user/outputs' as a text fileif not exists word_count(word string,count int)
  9. ROW FORMAT DELIMITED
  10. FIELDS TERMINATED BY \t
  11. lines terminated by \n' STORED AS TEXTFILE LOCATION /user/outputs/;
  12. -- add the mapper&reducer scripts as resources,please change your/local/path
  13. --must use "add file",not add jart find map and reduce main class
  14. add file your/local/path/wordcount.jar;
  15. from (
  16. from raw_lines
  17. map raw_lines.line
  18. --call the mapper here
  19. using java -cp wordcount.jar WordCountMap
  20. as word,count
  21. cluster by word) map_output
  22. insert overwrite table word_count
  23. reduce map_output.word,map_output.count
  24. --call the reducer here
  25. using java -cp wordcount.jar WordCountReducer
  26. as word,count;

此hive sql保存为wordcount.hql

 

四、执行hive sql

  1. beeline -u [hiveserver] -n username -f wordcount.hql

 

简单说下Hive的自定义map与reduce内部原理:
hive读取文本文件,然后将其一行行输入系统标准输入中,用户自定义的Map读取标准输入流中数据,一行行处理,然后将其按照一定格式(例如:"key\tvalue")输出到标准输出流中,然后hive会将输出的字符串进行排序,然后再送到标准输入流中,Reduce再从标准输入流中读取数据进行相应处理,处理完成后,再送到标准输出流中,Hive再对Reduce结果进行处理存入表中。

猜你在找的大数据相关文章