当前位置:网站首页>Mapper输出数据中文乱码
Mapper输出数据中文乱码
2022-08-03 19:54:00 【阿年、嗯啊】
在做Map Join案例实操的时候,发现处理后的结果数据居然中文乱码。
大致需求是这样的:有两张表希望输出最终数据格式。
我们采用MapJoin的方式实现,将较小的表pd表加载到缓存中,保存到map集合中,然后Mapper中的map方法处理order表,将pid替换为pname
Mapper类
package com.qcln.mr.mapjoin;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
public class MJMapper extends Mapper<LongWritable, Text,Text, NullWritable> {
private Map<String,String> pMap = new HashMap<>();
private Text k = new Text();
@Override
protected void setup(Context context) throws IOException {
//读取pd到pMap
//开流
URI[] cacheFiles = context.getCacheFiles();
FileSystem fs = FileSystem.get(context.getConfiguration());
FSDataInputStream open = fs.open(new Path(cacheFiles[0]));
//将文件按行处理,读取到pMap中
// 因为上面的字节流没法读一行,所以要转换流,转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(open));
String line;
while(StringUtils.isNotEmpty(line = br.readLine())){
String[] split = line.split("\t");
pMap.put(split[0],split[1]);
}
IOUtils.closeStream(br);
}
/**
* 处理order.txt文件
* @param key
* @param value
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] fields = value.toString().split("\t");
// 将pid替换
k.set(fields[0] + "\t" + pMap.get(fields[1])+ "\t" + fields[2]);
context.write(k,NullWritable.get());
}
}
Driver类
package com.qcln.mr.mapjoin;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.net.URI;
public class MJDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Job job = Job.getInstance(new Configuration());
job.setJarByClass(MJDriver.class);
job.setMapperClass(MJMapper.class);
job.setNumReduceTasks(0);
//添加分布式缓存
job.addCacheFile(URI.create(args[0]));
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
FileInputFormat.setInputPaths(job,new Path(args[1]));
FileOutputFormat.setOutputPath(job,new Path(args[2]));
boolean b = job.waitForCompletion(true);
System.exit(b ? 0 : 1);
}
}
然而运行结果是:
这显然不对,怎么会有乱码呢?按道理输出应该是这样子的啊。
我明明输入文件都是UTF-8的,为啥处理后就乱码了呢。再去检查代码,发现在流转换操作的时候加上字符编码就不会产生乱码,将代码改成如下
BufferedReader br = new BufferedReader(new InputStreamReader(open,"UTF-8"));
再次测试,乱码问题解决。
所以以后在进行流转换操作的时候要格外留意一下字符编码问题,很容易漏掉
边栏推荐
- node版本切换工具NVM以及npm源管理器nrm
- 从腾讯阿里等大厂出来创业搞 Web3、元宇宙的人在搞什么
- LeetCode 952. Calculate Maximum Component Size by Common Factor
- Anaconda virtual environment migration
- net-snmp私有mib动态加载到snmpd
- 【leetcode】剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口,双指针)
- 「游戏建模干货」建模大师几步操作,学习经典,赶紧脑补一下吧
- 【飞控开发高级教程6】疯壳·开源编队无人机-AI语音控制
- 开源教育论坛| ChinaOSC
- LeetCode 622. Designing Circular Queues
猜你喜欢
倒计时2天,“文化数字化战略新型基础设施暨文化艺术链生态建设发布会”启幕在即
LeetCode 952. 按公因数计算最大组件大小
手把手教你定位线上MySQL慢查询问题,包教包会
友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议
【leetcode】剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口,双指针)
LeetCode 952. Calculate Maximum Component Size by Common Factor
MySQL master-slave, 6 minutes you master!
亚马逊云科技 Build On 2022 - AIot 第二季物联网专场实验心得
Golang死信队列的使用
头条服务端一面经典10道面试题解析
随机推荐
涨薪5K必学高并发核心编程,限流原理与实战,分布式计数器限流
Matlab论文插图绘制模板第42期—气泡矩阵图(相关系数矩阵图)
告诉你0基础怎么学好游戏建模?
FreeRTOS中级篇
NNLM、RNNLM等语言模型 实现 下一单词预测(next-word prediction)
PHP according to the longitude and latitude calculated distance two points
ECCV 2022 Oral | 满分论文!视频实例分割新SOTA: IDOL
揭秘5名运维如何轻松管理数亿级流量系统
Matlab paper illustration drawing template No. 42 - bubble matrix diagram (correlation coefficient matrix diagram)
「学习笔记」高斯消元
ADS 2023 Download Link
Jingdong cloud released a new generation of distributed database StarDB 5.0
嵌入式分享合集27
宁德时代2号人物黄世霖辞任副董事长:身价1370亿
阿洛的反思
线上一次JVM FullGC搞得整晚都没睡,彻底崩溃
Handler source code analysis
子结点的数量(2)
LeetCode 1374. 生成每种字符都是奇数个的字符串
CS kill-free pose