Spark读取日志文件集中文乱码解决方法

Spark读取日志中文乱码解决方法

问题展示

����

一般来说,这个问题多出现于GBK与UTF-8编码互相转换时。众所周知,GBK编码是windows系统的编码格式,而UTF-8是linux系统的编码格式,而且Git等开源软件也都使用UTF-8编码,所以简单了解这种编码问题就是一件十分必要的事情。

乱码切入

“����”

“锟斤拷”

"手持两把锟斤拷,口中疾呼烫烫烫,脚踏千朵屯屯屯,笑看万物锘锘锘”

先来段梗,娱乐一下,给出百科的解释,给各位科普一下
Spark读取日志文件集中文乱码解决方法_第1张图片这里先分析下乱码原因,因为spark没有自己读取文件的方式所以它采用了hadoop的默认读取文件方式,一般日志文件的格式是GBK编码的,而hadoop上的编码格式默认使用UTF-8,导致最终输出乱码。

所以要正常读取文件集,需要制定编码格式是GBK的,下面通过一个案例来表示直接读取和指定方式读取的结果差别。

直接使用spark的textfile读取

SparkConf conf = new SparkConf().setAppName("first").setMaster("local");
JavaRDD<String> distFile = sc.textFile("data.txt");

Spark读取日志文件集中文乱码解决方法_第2张图片

由于textFile函数只能固定使用UTF-8编码格式读取文件,然后读到的结果在终端中展示为 “����”或者就是 “锟斤拷”这个样子 ,这也是“手持两把锟斤拷,口中疾呼烫烫烫;脚踏千朵屯屯屯,笑看万物锘锘锘” 这个编码梗的由来。

解决问题

既然使用大数据计算框架遇到问题,就应该用大数据本身的框架来解决问题

先调用 hadoopFile()来读取文件,然后将读到的RDD map(映射)成一个使用GBK编码新生成的字符串传导出去,调用map(p -> new String(p._2.getBytes(), 0, p._2.getLength(), “GBK”)),即可解决问题。

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text
import org.apache.hadoop.mapred.TextInputFormat
import org.apache.spark.rdd.RDD
//文件存放目录
val input = "./input"   
val conf = new SparkConf
val context = new SparkContext(conf)
val outputRdd = context.hadoopFile(input, classOf[TextInputFormat],
        classOf[LongWritable], classOf[Text]).map(
        pair => new String(pair._2.getBytes, 0, pair._2.getLength, "GBK"))

image-20211130172355942

了解更多知识请戳下:

@Author:懒羊羊

你可能感兴趣的:(Experience,intellij-idea,java,intellij,idea,spark,scala)