运用hadoop计算TF-IDF续-支持中文读取-支持文件输出控制

jackydai987在文章《运用hadoop计算TF-IDF》(http://blog.csdn.net/jackydai987/article/details/6303459)提到了TF-IDF的计算,但是留下几个问题:

1、       输出的文件控制

2、       对中文字符的处理

为此本文做如下改进:

请参见《HadoopMapReduce中多文件输出http://blog.csdn.net/jackydai987/archive/2011/03/12/6244725.aspx

文中提出了三个类:

My_LineRead.java(修改使用)

MyMultipleOutputFormat.java(保留使用)

以及嵌入到主程序的

MyMultiple.java(修改使用)

1.     public static class MyMultiple extends MyMultipleOutputFormat{  

2.    

3.          @Override  

4.          protected String generateFileNameForKeyValue(WritableComparable key,  

5.                  Writable value, Configuration conf) {  

6.              // TODO Auto-generated method stub  

7.              return "other.txt";  

8.          }  

9.            

10.     } 

具体修改如下:

1、修改MyMultiple.java,保证产生的输出文件名为源文件名

       publicstatic class MyMultiple extends MyMultipleOutputFormat{

              @Override

              protectedString generateFileNameForKeyValue(WritableComparable key,

                            Writablevalue, Configuration conf) {

                     //TODO Auto-generated method stub

                     String[]c = value.toString().split(" "); 

           //以文件名为输出的文件名

                     returnc[0] + ".txt"; 

          }

             

}

2、修改My_LineRead以支持中文读入输出

其他原理参考:http://blog.csdn.net/guoery/article/details/8557094

具体如下:

//private static final String utf8 ="UTF-8";

改为:

private static final String utf8 ="GBK";

 

@Override

       public void write(K key, V value) throwsIOException,

                     InterruptedException {

              if (!(key==null && key instanceofNullWritable)){

                     //如果key不为空者输出key

                     if((Object)keyinstanceof Text){

          //下面的注释掉

                     /*

                            Text to = (Text)key;

                            out.write(to.getBytes(),0, to.getLength());

                     }

                     else

                     {

                     */

                            out.write(key.toString().getBytes(utf8));

                     }

                     out.write(keyValueSeparator);

              }

              if(!(value ==null && value instanceofNullWritable)){

                     //如果value不为空则输出value

                     if((Object)valueinstanceof Text){

              //下面的注释掉

                            /*    Textto = (Text) value;

                            out.write(to.getBytes(),0, to.getLength());

                     }

                     else

                     {

                     */

                            out.write(value.toString().getBytes(utf8));

                     }

                     out.write(newline);

              }

             

}

3、在主程序中修改:

//设置多文件输出

        job1.setOutputFormatClass(MyMultiple.class);

        Job2.setOutputFormatClass(MyMultiple.class);

输出结果如下图:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值