spark读取当前处理数据的文件名

本文介绍如何使用Spark在Hadoop环境中读取文件名,并提供了两种不同版本的实现方式:一种基于mapreduce,另一种基于mapred。通过具体代码示例展示了如何配置SparkConf,创建SparkContext,以及如何利用NewHadoopRDD和HadoopRDD处理文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考

http://hanyingjun318.iteye.com/blog/2277512

环境
idea;sbt;
hadoop

在hadoop中读取文件名

InputSplit inputSplit=(InputSplit)context.getInputSplit();  
String filename=((FileSplit)inputSplit).getPath().getName();  
spark

spark代码,在本地测试有效,mr有mapred和mapreduce两种
mapreduce

import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.hadoop.mapreduce.InputSplit
import org.apache.hadoop.mapreduce.lib.input.{FileSplit, TextInputFormat}
import org.apache.spark.rdd.NewHadoopRDD

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

    val conf = new SparkConf()
    conf.setAppName("testtoParquet")
    conf.setMaster("local")
    val sc = new SparkContext(conf)
    var input = "/home/dwj/data/testSpark/20180409"
    var output = ""

    val fileRDD = sc.newAPIHadoopFile[LongWritable, Text, TextInputFormat](input)
    val hadoopRDD = fileRDD.asInstanceOf[NewHadoopRDD[LongWritable, Text]]
    val fileAdnLine = hadoopRDD.mapPartitionsWithInputSplit((inputSplit:InputSplit, iterator:Iterator[(LongWritable, Text)]) => {
      val file = inputSplit.asInstanceOf[FileSplit]
      iterator.map(x => {file.getPath.toString()+"\t" + x._2})
    })
    fileAdnLine.foreach(println)
  }
}

mapred

import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.hadoop.mapred.{FileSplit, InputSplit, TextInputFormat}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.HadoopRDD

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

    val conf = new SparkConf()
    conf.setAppName("testtoParquet")
    conf.setMaster("local")
    val sc = new SparkContext(conf)
    var input = "/home/dwj/data/testSpark/20180409"

    val fileRDD = sc.hadoopFile[LongWritable, Text, TextInputFormat](input)
    val hadoopRDD = fileRDD.asInstanceOf[HadoopRDD[LongWritable, Text]]
    val fileAdnLine = hadoopRDD.mapPartitionsWithInputSplit((inputSplit:InputSplit,iterator:Iterator[(LongWritable, Text)]) => {
      val file = inputSplit.asInstanceOf[FileSplit]
      iterator.map(x => {file.getPath.toString()+"\t" + x._2})
    })
    fileAdnLine.foreach(println)
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值