版权声明:本人版权所有,翻版必究!!!!! 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()
}
}
打印结果:
之所以会出现上面的乱码问题,其实问题的本源很简答,就是编码和解码使用的不一致,关于字符编码问题大家可以看看这个字符编码白话理解