Spark - newAPIHadoopFIle 获取文件与文件路径 By Scala

本文介绍如何使用Apache Spark的NewHadoopRDD API,通过FileSplit获取无时间戳日志文件的创建时间,展示了如何在读取过程中按文件路径解析时间分区。实践步骤包括配置Spark、读取文件RDD并应用mapPartitionsWithInputSplit操作。

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

一.引言

离线日志通常使用 dt,hour,min 或者使用 timeStamp 作为累计文件的命名方式,对于文件日志中不包含时间戳或者时间信息的日志内容,为了获取其对应创建时间与文件属性,需要读取文件时同时获取其 File 对应的 FileSplit 类。

二.实践

1.思路

A. sc.newAPIHadoopFile  读取输入获得 RDD[(LongWritable, Text)]

B. asInstanceOf 转换为 NewHadoopRDD[LongWritable, Text] 

C. NewHadoopRDD 支持 mapPartitionWithInputSplit ,按照输入的文件进行分区处理文件

D. inputSplit 转化为 FileSplit,既可以通过 getPath 得到路径从而解析出文件对应的时间分区

2.实现

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

object TextFileWIthSplit {

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

    val (argsList, argsMap) = ArgsParseUtil.parseArgs(args)
    val local = argsMap.getOrElse("local", "true").toBoolean // 是否是本地模式
    // 1.配置Spark
    val input = argsMap.getOrElse("input", "")
    val output = argsMap.getOrElse("output", "")
    val conf = {
      if (local)
        new SparkConf().setAppName("TextFileWIthSplit").setMaster("local[1]")
      else
        new SparkConf().setAppName("TextFileWIthSplit")
    }
    // 2.spark初始化
    val sc = new SparkContext(conf)

    // 3.读取FileRDD
    val fileRDD = sc.newAPIHadoopFile[LongWritable, Text, TextInputFormat](input)
    val hadoopRDD = fileRDD.asInstanceOf[NewHadoopRDD[LongWritable, Text]]
    hadoopRDD.mapPartitionsWithInputSplit((inputSplit: InputSplit, iterator: Iterator[(LongWritable, Text)]) => {
      val file = inputSplit.asInstanceOf[FileSplit]
      val path = file.getPath.toString
      iterator.map(line => {
        path + "\t" + line
      })
    }).saveAsTextFile(output)

  }
}

 假设 user 目录下存在 test_path 文件且文件中包含5个数字,则执行上述代码获取如下结果:

viewfs://c9/user/test_path    1
viewfs://c9/user/test_path    2
viewfs://c9/user/test_path    3
viewfs://c9/user/test_path    4
viewfs://c9/user/test_path    5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值