在spark中常使用textFile讀取文件,默認的是UTF-8編碼,但在實際讀取文件時,存在不同的文件編碼,如果不是UTF-8編碼的文件,便不能直接使用這個方法讀文件。
以下是2種讀取不同編碼文件的方法,下面以ANSI的中文簡體編碼為例,codepage是1252.
方法1:使用decode方法
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
val encoding = "cp1252" val df = spark.read.format("text").load(files).select(decode(col("value"), encoding).as("value")) val rdd1 = df.rdd.map(row => row.get(0).toString).map(_.split("\\|"))
方法2:使用hadoopFile方法讀文件,並對每一個(k,v) 元組,使用指定編碼讀取字節並轉換為字符串
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
val encoding = "cp1252" val rdd1 = spark.sparkContext.hadoopFile(files, classOf[TextInputFormat], classOf[LongWritable], classOf[Text]).map { case (_, t) => new String(t.getBytes, 0, t.getLength, encoding) }.map(_.split("\\|"))