ITPub博客

首页 > > > spark文件输出不想使用hadoop默认压缩时,怎么办?

spark文件输出不想使用hadoop默认压缩时,怎么办?

作者:quyuehui 时间:2019-10-10 19:44:39 0 删除 编辑

适用场景:当hadoop配置了默认的hdfs输出压缩格式,而spark的hdfs文件输出不想用hadoop配置的压缩方式

 

方式1:调用SparkContext的hadoopRDD,得到RDD[key, value],然后调用RDD[key, value]的saveAsHadoopFile接口

示例如下:

package spark.local.test


import org.apache.hadoop.conf.Configuration

import org.apache.hadoop.fs.{Path, FileSystem}

import org.apache.hadoop.io.{NullWritable, LongWritable, Text}

import org.apache.hadoop.mapred.{JobConf, TextOutputFormat}

import org.apache.hadoop.mapreduce.Job

import org.apache.hadoop.mapred.{FileInputFormat, TextInputFormat, JobConf}

import org.apache.spark.rdd.RDD

import org.apache.spark.{SparkContext, SparkConf}

import org.apache.log4j.{Logger, Level}

 

/**

* Created by xuhong on 2015/4/22.

*/

object Test1 {

  def main(args: Array[String]): Unit = {

    val sparkConf: SparkConf = new SparkConf().setAppName("test")

    val sc: SparkContext = new SparkContext(sparkConf)

    val hadoopConfig = new Configuration()

    hadoopConfig.set("fs.default.name", "hdfs://mz-hadoop-1.meizu.com:9000")

    val fileSystem: FileSystem = FileSystem.get(hadoopConfig)*/

    val config = new JobConf(fileSystem.getConf())

    config.set("mapred.output.compress", "false") 

    FileInputFormat.setInputPaths(config, new Path(args(1)))

    val rdd0: RDD[(LongWritable, Text)] = sc.hadoopRDD(config, classOf[TextInputFormat], classOf[LongWritable], classOf[Text])

    rdd0.map(value => (NullWritable, value._2)).saveAsHadoopFile(args(2),classOf[NullWritable], classOf[Text], classOf[TextOutputFormat[NullWritable,Text]], config)

  }

}

 

方式二:直接获取SparkContext的hadoopconfiguration变量,然后设置hadoopconfiguration的压缩方式为false

示例如下;

package spark.local.test

 

import org.apache.hadoop.conf.Configuration

import org.apache.hadoop.fs.{Path, FileSystem}

import org.apache.hadoop.io.{NullWritable, LongWritable, Text}

import org.apache.hadoop.mapred.{JobConf, TextOutputFormat}

import org.apache.hadoop.mapreduce.Job

import org.apache.hadoop.mapred.{FileInputFormat, TextInputFormat, JobConf}

import org.apache.spark.rdd.RDD

import org.apache.spark.{SparkContext, SparkConf}

import org.apache.log4j.{Logger, Level}

 

/**

* Created by xuhong on 2015/4/22.

*/

object Test1 {

  def main(args: Array[String]): Unit = {

    val sparkConf: SparkConf = new SparkConf().setAppName("test")

    val sc: SparkContext = new SparkContext(sparkConf)

    val hadoopConfig: Configuration = sc.hadoopConfiguration

    hadoopConfig.set("mapred.output.compress", "false")

    val rdd: RDD[(String)] = sc.textFile(args(0))

    println("count of rdd is **********************************************  " + rdd.count())

    rdd.saveAsTextFile(args(1))

  }

}

 

小结:第一种方式相对比较繁琐,需要调用hadoopRDD和saveAsHadoopFile接口,RDD里面的元素必须是KV形式;第二种方式则相对简单易用。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69949006/viewspace-3154810/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-10-10

  • 博文量
    7
  • 访问量
    0