spark讀取GBK文件的方法

spark讀取GBK文件亂碼

spark的textFile方法默認(rèn)寫死了讀UTF-8格式的文件,讀其他格式的文件則會(huì)顯示亂碼。如下面的代碼所示


object Test2 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("PowerLeo")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    spark.sparkContext.setLogLevel("WARN")

    val sc = spark.sparkContext

    val fileRdd = sc.textFile("file:///C:\\Users\\leo\\Desktop\\20190704\\bigdata_buy2_fq_2019_07_04.DAT")
    fileRdd.foreach(println(_))

    spark.stop()
  }
}

結(jié)果截圖:

spark

解決方法


object Test2 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("PowerLeo")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    spark.sparkContext.setLogLevel("WARN")

    val sc = spark.sparkContext

    //val fileRdd = sc.textFile("file:///C:\\Users\\leo\\Desktop\\20190704\\bigdata_buy2_fq_2019_07_04.DAT")
    //val fileRdd = transfer(sc, "file:///C:\\Users\\leo\\Desktop\\20190704\\bigdata_buy2_fq_2019_07_04.DAT")
    val fileRdd = loadFileToRdd(sc,"file:///C:\\\\Users\\\\leo\\\\Desktop\\\\20190704\\\\bigdata_buy2_fq_2019_07_04.DAT")
    
    fileRdd.foreach(println(_))

    spark.stop()
  }

  def transfer(sc: SparkContext, path: String): RDD[String] = {
    sc.hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], 1)
      .map(p => new String(p._2.getBytes, 0, p._2.getLength, "GBK"))
  }

  /**
    *
    * @param sc       spark context 上下文
    * @param path     文件讀取路徑
    * @param encoding 文件編碼
    * @return (文件路徑名,文件行內(nèi)容)
    */
  def loadFileToRdd(sc: SparkContext, path: String, encoding: String = "GBK"): RDD[(String, String, Int)] = {
    sc.hadoopFile[LongWritable, Text, TextInputFormat](path)
      .asInstanceOf[HadoopRDD[LongWritable, Text]]
      .mapPartitionsWithInputSplit((inputSplit: InputSplit, iterator: Iterator[(LongWritable, Text)]) => {
        val file = inputSplit.asInstanceOf[FileSplit]
        iterator.filter(x => x._2 != null).map(x => {
          (file.getPath.getName, new String(x._2.getBytes, 0, x._2.getLength, encoding), 1)
        })
      })
  }
}


運(yùn)行截圖:

res
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容