设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间17 现在时间17 缓存数据 墨染,去年就是因为这个名字喜欢上他的[爱心]

墨染,去年就是因为这个名字喜欢上他的[爱心] -- 烟雨行舟

查看: 1099|回复: 2

java spark文件读取乱码问题的解决方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:15
  • 打卡月天数:0
  • 打卡总奖励:281
  • 最近打卡:2023-08-27 07:15:02
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
47
主题
37
精华
0
金钱
417
积分
94
注册时间
2023-8-13
最后登录
2025-9-8

发表于 2024-10-29 01:57:28 | 显示全部楼层 |阅读模式
目录
  • 一、问题
  • 二、心酸历程
    • 1、textFile+Configuration方式——乱码
    • 2、spark.read().option方式——乱码
    • 3、newAPIHadoopFile+Configuration——乱码
    • 4、newAPIHadoopFile+自定义类——乱码
    • 5、newAPIHadoopRDD+自定义类——乱码
  • 三、最终解决

    一、问题

    环境为jdk1.8,spark3.2.1,读取hadoop中GB18030编码格式的文件出现乱码。

    二、心酸历程

    为了解决该问题,尝试过很多种方法,但都没有成功

    1、textFile+Configuration方式——乱码

    1. String filePath = "hdfs:///user/test.deflate";
    2. //创建SparkSession和SparkContext的实例
    3. String encoding = "GB18030";
    4. SparkSession spark = SparkSession.builder()
    5. .master("local[*]").appName("Spark Example")
    6. .getOrCreate();
    7. JavaSparkContext sc = JavaSparkContext.fromSparkContext(spark.sparkContext());
    8. Configuration entries = sc.hadoopConfiguration();
    9. entries.set("textinputformat.record.delimiter", "\n");
    10. entries.set("mapreduce.input.fileinputformat.inputdir",filePath);entries.set("mapreduce.input.fileinputformat.encoding", "GB18030");
    11. JavaRDD<String> rdd = sc.textFile(filePath);
    复制代码

    2、spark.read().option方式——乱码

    1. Dataset<Row> load = spark.read().format("text").option("encoding", "GB18030").load(filePath);
    2. load.foreach(row -> {
    3. System.out.println(row.toString());
    4. System.out.println(new String(row.toString().getBytes(encoding),"UTF-8"));
    5. System.out.println(new String(row.toString().getBytes(encoding),"GBK"));
    6. });
    复制代码

    3、newAPIHadoopFile+Configuration——乱码

    1. JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, TextInputFormat.class, LongWritable.class, Text.class, entries );
    2. System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD.count());
    3. longWritableTextJavaPairRDD.foreach(k->{
    4. System.out.println(k._2);
    5. });
    复制代码

    4、newAPIHadoopFile+自定义类——乱码

    1. JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, GBKInputFormat.class, LongWritable.class, Text.class, entries );
    2. System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD.count());
    3. longWritableTextJavaPairRDD.foreach(k->{
    4. System.out.println(k._2);
    5. });
    复制代码

    代码中GBKInputFormat.class是TextInputFormat.class复制将内部UTF-8修改为GB18030所得

    5、newAPIHadoopRDD+自定义类——乱码

    1. JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD1 = sc.newAPIHadoopRDD(entries, GBKInputFormat.class, LongWritable.class, Text.class);
    2. System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD1.count());
    3. longWritableTextJavaPairRDD1.foreach(k->{
    4. System.out.println(k._2());
    5. });
    复制代码

    三、最终解决

    上述方法感觉指定的字符编码并没有生效不知道为什么,如有了解原因的还请为我解惑,谢谢

    最终解决方案如下

    1. JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, TextInputFormat.class, LongWritable.class, Text.class, new Configuration());
    2. System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD.count());
    3. longWritableTextJavaPairRDD.foreach(k->{
    4. System.out.println(new String(k._2.copyBytes(), encoding));
    5. });
    6. JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD1 = sc.newAPIHadoopRDD(entries, TextInputFormat.class, LongWritable.class, Text.class);
    7. System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD1.count());
    8. longWritableTextJavaPairRDD1.foreach(k->{
    9. System.out.println(new String(k._2().copyBytes(),encoding));
    10. System.out.println(new String(k._2.copyBytes(),encoding));
    11. });
    复制代码

    主要是new String(k._2().copyBytes(),encoding)得以解决

    到此这篇关于java spark文件读取乱码问题的解决方法的文章就介绍到这了,更多相关java spark文件读取乱码内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
    晓枫资讯-科技资讯社区-免责声明
    免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
          1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
          2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
          3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
          4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
          5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

      离线 

    TA的专栏

    等级头衔

    等級:晓枫资讯-列兵

    在线时间
    0 小时

    积分成就
    威望
    0
    贡献
    0
    主题
    0
    精华
    0
    金钱
    16
    积分
    12
    注册时间
    2022-12-27
    最后登录
    2022-12-27

    发表于 2025-1-26 09:08:53 | 显示全部楼层
    感谢楼主,顶。
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

      离线 

    TA的专栏

    等级头衔

    等級:晓枫资讯-列兵

    在线时间
    0 小时

    积分成就
    威望
    0
    贡献
    0
    主题
    0
    精华
    0
    金钱
    11
    积分
    2
    注册时间
    2024-9-17
    最后登录
    2024-9-17

    发表于 5 天前 | 显示全部楼层
    顶顶更健康!!!
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
    严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    1楼
    2楼
    3楼

    手机版|晓枫资讯--科技资讯社区 本站已运行

    CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

    晓枫资讯--科技资讯社区

    本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

    如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表