立即注册 登录
About云-梭伦科技 返回首页

s060403072的个人空间 https://aboutyun.com/?57 [收藏] [复制] [分享] [RSS]

日志

Spark如何实现多文件输出

热度 4已有 8694 次阅读2015-3-13 12:18

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

import org.apache.hadoop.io.NullWritable

import org.apache.spark._
import org.apache.spark.SparkContext._


import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat

class RDDMultipleTextOutputFormat extends MultipleTextOutputFormat[Any, Any] {
  override def generateFileNameForKeyValue(key: Any, value: Any, name: String): String =
    key.asInstanceOf[String]
}

object Split {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("SplitTest")
    val sc = new SparkContext(conf)
    sc.parallelize(List(("w", "www"), ("b", "blog"), ("c", "com"), ("w", "bt")))
      .map(value => (value._1, value._2 + "Test"))
      .partitionBy(new HashPartitioner(3))
      .saveAsHadoopFile("/iteblog", classOf[String], classOf[String],
        classOf[RDDMultipleTextOutputFormat])
    sc.stop()
  }
}
RDDMultipleTextOutputFormat类中的generateFileNameForKeyValue函数有三个参数,key和value就是我们RDD的Key和Value,而name参数是每个Reduce的编号。本例中没有使用该参数,而是直接将同一个Key的数据输出到同一个文件中。执行:
bin/spark-submit --master yarn-cluster
--class Split ./a-1.0-SNAPSHOT.jar

然后我们可以看到在HDFS上输出的文件列表如下:

bin/hadoop fs -ls /a


https://github.com/apache/spark/pull/4895,很有可能会在Spark 1.4.0版本添加。

3

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (3 人)

发表评论 评论 (1 个评论)

回复 regan 2015-12-8 20:00
  

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条