����
一般来说,这个问题多出现于GBK与UTF-8编码互相转换时。众所周知,GBK编码是windows系统的编码格式,而UTF-8是linux系统的编码格式,而且Git等开源软件也都使用UTF-8编码,所以简单了解这种编码问题就是一件十分必要的事情。
乱码切入“����”
“锟斤拷”
"手持两把锟斤拷,口中疾呼烫烫烫,脚踏千朵屯屯屯,笑看万物锘锘锘”
先来段梗,娱乐一下,给出百科的解释,给各位科普一下
这里先分析下乱码原因,因为spark没有自己读取文件的方式所以它采用了hadoop的默认读取文件方式,一般日志文件的格式是GBK编码的,而hadoop上的编码格式默认使用UTF-8,导致最终输出乱码。
所以要正常读取文件集,需要制定编码格式是GBK的,下面通过一个案例来表示直接读取和指定方式读取的结果差别。
直接使用spark的textfile读取
SparkConf conf = new SparkConf().setAppName("first").setMaster("local"); JavaRDDdistFile = sc.textFile("data.txt");
由于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"))
了解更多知识请戳下:
@Author:懒羊羊
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)