spark处理中文乱码问题!!|����| | �㶫| | �Ϻ�| |����| |����| |����|

版权声明:本人版权所有,翻版必究!!!!! https://blog.csdn.net/qq_36968512/article/details/82527236

既然能看见这篇文章,说明你遇到是乱码问题,具体问题咱们就不再分析了,直接来看为什么乱码,如何不让它乱码
首先咱们分析为什么会乱码,首先因为spark没有自己读取文件的方式所以它采用了hadoop的读取文件的方式,因为日志的格式是GBK编码的,而hadoop上的编码默认是用UTF-8,导致最终输出乱码。所以咱们应该制定编码格式是GBK的,下面通过一个案例来表示直接读取和指定方式读取的结果差别,以及代码的修改位置
直接使用spark的textfile读取:


import org.apache.spark.sql
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

object helllo_dataset {
  def main(args: Array[String]): Unit = {
    val spark=new sql.SparkSession.Builder().master("local").appName("helllo_dataset").getOrCreate()
    val data_DS: Dataset[String] = spark.read.textFile("ip.txt")
    //ip.txt的文件格式(1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302)
    import spark.implicits._
    val ipDS: Dataset[String] = data_DS.map(line => {
      val data_demo: Array[String] = line.split("[|]")
      val ip = data_demo(6)
      ip
    })
    val ipDF: DataFrame = ipDS.toDF("ip")
    ipDF.createTempView("T_ip_data")
    val result: DataFrame = spark.sql("select ip from T_ip_data")
    result.show()
  }
}

输出结果:
这里写图片描述

下面我们跳过spark的textfile,直接在hadoopfile上对参数进行限定,代码如下


import org.apache.spark.sql
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}
import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.hadoop.mapred.TextInputFormat
import org.apache.spark.rdd.RDD

object saprkSql_ {
  def main(args: Array[String]): Unit = {
    val spark=new sql.SparkSession.Builder().master("local").appName("helllo_dataset").getOrCreate()
//代码不一样的地方就在这里!!!(下面这一段代码)
    val data_DS: RDD[String] = spark.sparkContext.hadoopFile("C:\\Users\\qixing\\Desktop\\ip.txt", classOf[TextInputFormat],
      classOf[LongWritable], classOf[Text]).map(
      pair => new String(pair._2.getBytes, 0, pair._2.getLength, "GBK"))
    import spark.implicits._

        val ipDS: RDD[String] = data_DS.map(line => {
          val data_demo: Array[String] = line.split("[|]")
          val ip = data_demo(6)
          ip
        })
    ipDS
    val ipDF: DataFrame = ipDS.toDF("ip")
    ipDF.createTempView("T_ip_data")
    val result: DataFrame = spark.sql("select ip from T_ip_data")
    result.show()
  }
}

打印结果:
这里写图片描述

之所以会出现上面的乱码问题,其实问题的本源很简答,就是编码和解码使用的不一致,关于字符编码问题大家可以看看这个字符编码白话理解

猜你喜欢

转载自blog.csdn.net/qq_36968512/article/details/82527236