java spark文件讀取亂碼問題的解決方法
一、問題
環(huán)境為jdk1.8,spark3.2.1,讀取hadoop中GB18030編碼格式的文件出現(xiàn)亂碼。
二、心酸歷程
為了解決該問題,嘗試過很多種方法,但都沒有成功
1、textFile+Configuration方式——亂碼
String filePath = "hdfs:///user/test.deflate";
//創(chuàng)建SparkSession和SparkContext的實(shí)例
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復(fù)制將內(nèi)部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)得以解決
到此這篇關(guān)于java spark文件讀取亂碼問題的解決方法的文章就介紹到這了,更多相關(guān)java spark文件讀取亂碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中關(guān)于優(yōu)先隊列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊列PriorityQueue的使用及相關(guān)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
基于JavaBean編輯器讀取peroperties文件的實(shí)例
下面小編就為大家?guī)硪黄贘avaBean編輯器讀取peroperties文件的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Java常用鎖synchronized和ReentrantLock的區(qū)別
這篇文章主要介紹了Java常用鎖synchronized和ReentrantLock的區(qū)別,二者的功效都是相同的,但又有很多不同點(diǎn),下面我們就進(jìn)入文章了解具體的相關(guān)內(nèi)容吧。需要的小伙伴也可以參考一下2022-05-05
Java實(shí)現(xiàn)的漢語拼音工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的漢語拼音工具類,結(jié)合完整實(shí)例形式分析了java基于pinyin4j包實(shí)現(xiàn)編碼轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Spring Schedule Task動態(tài)改寫Cron配置方式
這篇文章主要介紹了Spring Schedule Task動態(tài)改寫Cron配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

