scala读取HDFS文件,每次读取一定的字节数

本文介绍了如何使用Scala编程语言从HDFS(Hadoop分布式文件系统)中读取文件,特别是每次读取指定数量的字节。内容涵盖了相关的方法和技巧,帮助读者理解并实现这一功能。
用scala读取一个只有字符的文件,该文件是已经清洗完的数据,有规律,一行是一条数据。
现在的需求是一次读取文件中的一部分,依次读取完。
 
 
如果有疑问,或者找出错误的解决方案,请和我联系。一起研究讨论
  
  
  
[plain] view plain copy
  1. import java.io.IOException  
  2. import java.net.URI  
  3.   
  4. import org.apache.hadoop.conf.Configuration  
  5. import org.apache.hadoop.fs.{FSDataInputStream, FileSystem, Path}  
  6.   
  7. /**  
  8.   * Created by wx on 2017/7/20.  
  9.   */  
  10. object HDFSUtil {  
  11.   val conf: Configuration = new Configuration  
  12.   var fs: FileSystem = null  
  13.   var hdfsInStream: FSDataInputStream = null  
  14.   
  15.   def getFSDataInputStream(path: String): FSDataInputStream = {  
  16.     try {  
  17.       fs = FileSystem.get(URI.create(path), conf)  
  18.       hdfsInStream = fs.open(new Path(path))  
  19.     } catch {  
  20.       case e: IOException => {  
  21.         e.printStackTrace  
  22.       }  
  23.     }  
  24.     return hdfsInStream  
  25.   }  
  26.   
  27.   def close {  
Spark 读取文件时处理文件编码问题有以下几种方法: #### 使用 `new String` 转换编码 在读取文件后,可使用 `new String` 对读取的字节进行编码转换。例如,读取 UTF - 8 文件时出现乱码,可按如下方式处理: ```scala spark.sparkContext.textFile("") .map(str => { new String(str.getBytes, "UTF-8") }) ``` 这种方式适用于使用 `textFile` 方法读取文件时的编码转换[^2]。 #### 使用 `hadoopFile` 并指定编码 在处理特定编码文件时,可使用 `hadoopFile` 方法,同时在 `map` 函数中指定编码。以读取 GBK 编码的 `.dat` 文件为例: ```scala import org.apache.hadoop.io.{LongWritable, Text} import org.apache.hadoop.mapred.TextInputFormat import org.apache.spark.SparkConf import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession val conf: SparkConf = new SparkConf().setMaster("local[*]") val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate() val sc = spark.sparkContext val data_path = "hdfs://192.168.10.100:9000/data_row/f_dep.dat" var inputRdd: RDD[String] = sc.hadoopFile(data_path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text]) .map(pair => new String(pair._2.getBytes, 0, pair._2.getLength, "GBK")) ``` 上述代码使用 `hadoopFile` 方法读取文件,并在 `map` 函数中将读取的字节按 GBK 编码转换为字符串,从而解决编码问题[^1]。 #### 使用 `newAPIHadoopFile` 并指定编码 使用 `newAPIHadoopFile` 方法读取文件,然后在处理数据时指定编码。示例如下: ```java import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.hadoop.conf.Configuration; SparkConf conf = new SparkConf().setAppName("demo").setMaster("local[*]"); JavaSparkContext sc = new JavaSparkContext(conf); String filePath = "your_file_path"; String encoding = "GBK"; JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, TextInputFormat.class, LongWritable.class, Text.class, new Configuration()); longWritableTextJavaPairRDD.foreach(k -> { System.out.println(new String(k._2.copyBytes(), encoding)); }); ``` 此方法可有效处理文件读取时的编码问题,尤其适用于复杂场景[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值