
离线 TA的专栏
- 打卡等级:即来则安
- 打卡总天数:15
- 打卡月天数:0
- 打卡总奖励:281
- 最近打卡:2023-08-27 07:15:02
|
目录- 一、问题
- 二、心酸历程
- 1、textFile+Configuration方式——乱码
- 2、spark.read().option方式——乱码
- 3、newAPIHadoopFile+Configuration——乱码
- 4、newAPIHadoopFile+自定义类——乱码
- 5、newAPIHadoopRDD+自定义类——乱码
- 三、最终解决
一、问题
环境为jdk1.8,spark3.2.1,读取hadoop中GB18030编码格式的文件出现乱码。
二、心酸历程
为了解决该问题,尝试过很多种方法,但都没有成功
1、textFile+Configuration方式——乱码
- String filePath = "hdfs:///user/test.deflate";
- //创建SparkSession和SparkContext的实例
- String encoding = "GB18030";
-
- SparkSession spark = SparkSession.builder()
- .master("local[*]").appName("Spark Example")
- .getOrCreate();
-
- JavaSparkContext sc = JavaSparkContext.fromSparkContext(spark.sparkContext());
- Configuration entries = sc.hadoopConfiguration();
- entries.set("textinputformat.record.delimiter", "\n");
- entries.set("mapreduce.input.fileinputformat.inputdir",filePath);entries.set("mapreduce.input.fileinputformat.encoding", "GB18030");
-
- JavaRDD<String> rdd = sc.textFile(filePath);
复制代码
2、spark.read().option方式——乱码
- Dataset<Row> load = spark.read().format("text").option("encoding", "GB18030").load(filePath);
-
- load.foreach(row -> {
- System.out.println(row.toString());
- System.out.println(new String(row.toString().getBytes(encoding),"UTF-8"));
- System.out.println(new String(row.toString().getBytes(encoding),"GBK"));
-
-
- });
复制代码
3、newAPIHadoopFile+Configuration——乱码
- JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, TextInputFormat.class, LongWritable.class, Text.class, entries );
-
- System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD.count());
- longWritableTextJavaPairRDD.foreach(k->{
-
- System.out.println(k._2);
- });
复制代码
4、newAPIHadoopFile+自定义类——乱码
- JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, GBKInputFormat.class, LongWritable.class, Text.class, entries );
-
- System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD.count());
- longWritableTextJavaPairRDD.foreach(k->{
-
- System.out.println(k._2);
- });
复制代码
代码中GBKInputFormat.class是TextInputFormat.class复制将内部UTF-8修改为GB18030所得
5、newAPIHadoopRDD+自定义类——乱码
- JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD1 = sc.newAPIHadoopRDD(entries, GBKInputFormat.class, LongWritable.class, Text.class);
- System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD1.count());
- longWritableTextJavaPairRDD1.foreach(k->{
- System.out.println(k._2());
- });
复制代码
三、最终解决
上述方法感觉指定的字符编码并没有生效不知道为什么,如有了解原因的还请为我解惑,谢谢
最终解决方案如下
- JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD = sc.newAPIHadoopFile(filePath, TextInputFormat.class, LongWritable.class, Text.class, new Configuration());
-
- System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD.count());
- longWritableTextJavaPairRDD.foreach(k->{
- System.out.println(new String(k._2.copyBytes(), encoding));
- });
-
- JavaPairRDD<LongWritable, Text> longWritableTextJavaPairRDD1 = sc.newAPIHadoopRDD(entries, TextInputFormat.class, LongWritable.class, Text.class);
-
- System.out.println("longWritableTextJavaPairRDD count ="+longWritableTextJavaPairRDD1.count());
- longWritableTextJavaPairRDD1.foreach(k->{
- System.out.println(new String(k._2().copyBytes(),encoding));
- System.out.println(new String(k._2.copyBytes(),encoding));
- });
复制代码
主要是new String(k._2().copyBytes(),encoding)得以解决
到此这篇关于java spark文件读取乱码问题的解决方法的文章就介绍到这了,更多相关java spark文件读取乱码内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯! 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|