Spark多文件输出(MultipleTextOutputFormat)

因为Spark内部写文件方式其实调用的都是Hadoop那一套东西,所以我们也可以通过Spark实现多文件输出。不过遗憾的是,Spark内部没有多文件输出的函数供大家直接调用,值得欣慰的是,我们自己实现这个功能也是很简单的。我们可以通过调用saveAsHadoopFile函数并自定义一个OutputFormat类即可,代码如下:

  1. import org.apache.hadoop.io.NullWritable  
  2.    
  3. import org.apache.spark._  
  4. import org.apache.spark.SparkContext._  
  5. import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat  
  6.    
  7. class RDDMultipleTextOutputFormat extends MultipleTextOutputFormat[Any, Any] {  
  8.   override def generateFileNameForKeyValue(key: Any, value: Any, name: String): String =  
  9.     key.asInstanceOf[String]  
  10. }  
  11.    
  12. object Split {  
  13.   def main(args: Array[String]) {  
  14.     val conf = new SparkConf().setAppName("SplitTest")  
  15.     val sc = new SparkContext(conf)  
  16.     sc.parallelize(List(("w", "www"), ("b", "blog"), ("c", "com"), ("w", "bt")))  
  17.       .map(value => (value._1, value._2 + "Test"))  
  18.       .partitionBy(new HashPartitioner(3))  
  19.       .saveAsHadoopFile("/iteblog", classOf[String], classOf[String],  
  20.         classOf[RDDMultipleTextOutputFormat])  
  21.     sc.stop()  
  22.   }  
  23. }  
  RDDMultipleTextOutputFormat类中的generateFileNameForKeyValue函数有三个参数,key和value就是我们RDD的Key和Value,而name参数是每个Reduce的编号。本例中没有使用该参数,而是直接将同一个Key的数据输出到同一个文件中。执行:
  1. bin/spark-submit --master yarn-cluster   
  2. --class Split ./iteblog-1.0-SNAPSHOT.jar  
  然后我们可以看到在HDFS上输出的文件列表如下:
  1. [iteblog@master ]$ bin/hadoop fs -ls /iteblog  
  2. Found 4 items  
  3. -rw-r--r--   3 iteblog hadoop2          0 2015-03-09 11:26 /iteblog/_SUCCESS  
  4. -rw-r--r--   3 iteblog hadoop2         11 2015-03-09 11:26 /iteblog/b  
  5. -rw-r--r--   3 iteblog hadoop2         10 2015-03-09 11:26 /iteblog/c  
  6. -rw-r--r--   3 iteblog hadoop2         19 2015-03-09 11:26 /iteblog/w  
  7.    
  8. [iteblog@master ]$ bin/hadoop fs -cat /iteblog/w  
  9. w   btTest  
  10. w   wwwTest  
  从上面的输出可以看出key为w的记录全部输出到文件名为w的文件中去了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值