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

作者:
Spark读取日志中文乱码解决方法 问题展示

����

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

乱码切入

“����”

“锟斤拷”

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

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

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

直接使用spark的textfile读取

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

image-20211130171715020

由于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:懒羊羊

the end

免责声明:本文内容均来自互联网,但不代表简明教程的观点和立场.

已有 5381 次赞