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<String> 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:懒羊羊

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会撸代码的懒羊羊

打赏5元,买杯咖啡醒,继续创作

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值