第三套题
一、python部分
( 1 ) 删 除 hotel.csv 中 商 圈 为 空 的 数 据 并 且 存 入 hotel2_c1_N.csv,N 为删除的数据条数;
shopping:这个是商圈的英文名称
dropna:删除是否为空
subset:判断哪一个字段
len:用于返回一个对象的长度或元素的数量。它可以用于字符串、列表、元组、字典、集合等可迭代对象。
to_csv:保存的csv文件
import pandas as pd
df = pd.read_csv("文件路径")
df_1 = df.dropna(subset=['shopping'])
df_2 = len(df) - len(df_1)
df.to_csv(f'hotel2_c1_{df_2}.csv', encoding='utf-8')
|
(2)删除 hotel.csv 中缺失值大于 3 个的数据列并且存 入 hotel2_c2_N.csv,N 为删除的数据列变量名,多列时用下划 线“_”间隔无顺序要求;
- columns: 判断每一列
- isnull:判断哪个数据为空
- sum:求和
- join:是一个字符串方法用于元素拼接,并返回新的字符串
import pandas as pd
df = pd.read_csv("文件路径")
df_1 = df.columns[df.isnull().sum() > 3]
df_2 = '_'.join(df_1)
df_3 = len(df) - len(df_2)
df.to_csv(f'hotel2_c2_{drop_3}.csv')
|
(3)将 hotel.csv 中评分为空的数据设置为 0 并且存入 hotel2_c3.csv;
- fillna:用来填数据中的缺失值
import pandas as pd
df = pd.read_csv("文件路径")
score = df['score'].fillna(0)
df.to_csv('hotel2_c3.csv')
|
(4)将 hotel.csv 中评分为空的数据设置为总平均评分 并且存入 hotel2_c4_N.csv,N 为总平均评分保留一位小数。
- round:用来对数字进行四舍五入后面逗号的 1 是总平均评分保留一位小数
- mea():计算平均数
import pandas as pd
df = pd.read_csv("文件路径")
score = round(df['score'].mean(), 1)
df.to_csv(f'hotel2_c4_{score}.csv')
|
二、数据统计MapReduce
hdfs操作
1.首先你要将user_info.csv拷贝到root下和hdfs上面
1.本地命令拷贝
scp -r 你存放文件的地方目录 root:你的机子ip地址:/root
# 完整的语句 scp -r user_info.csv [email protected]:/root
|
2、创建文件夹
1.在 HDFS 目录下新建目录/file2_1
2.查看目录命令截图
3、修改权限
1.修改权限,赋予目录/file2_1 最高 777 权限
hdfs dfs -chmod 777 /file2_1
|
2.查看 目录权限截图
4、下载 HDFS 新建目录/file2_1,到本地容器 Master 指定目录/root/下
- -get是下载
- -put是上传
hdfs dfs -get /file2-1 /root/
|
查看一下root是否成功下载下来file2_1
6.如果遇到:
mkdir: Cannot create directory /input. Name node is in safe mode.(意思是hadoop安全模式正在开启,要关掉才可以新建)
hadoop强制关掉安全模式:
hdfs dfsadmin -safemode forceExit
|
出现:Safe mode is OFF 就代表关掉成功了
修改mapred-site.xml 文件
1.cd到hadoop下
cd usr/local/src/hadoop-3.1.3/etc/hadoop/
|
2.vi编辑一下mapred-site.xml
将下面的复制到mapred-site.xml 里面
/usr/local/src/hadoop-3.1.3这是是你自己安装在哪个的文件目录
<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/src/hadoop-3.1.3</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/src/hadoop-3.1.3</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/src/hadoop-3.1.3</value> </property>
|
3.重启一下hadoop
4.将mapred-site.xml 拷贝到两台机子
/usr/local/src/hadoop-3.1.3/etc/hadoop/ (这个是你自己的文件存放目录)
# slave1 scp mapred-site.xml slave1:/usr/local/src/hadoop-3.1.3/etc/hadoop/
# slave2 scp mapred-site.xml slave2:/usr/local/src/hadoop-3.1.3/etc/hadoop/
|
5.最后启动一下hadoop
要是运行出错可能Hadoop没有启动完,稍微等一下就好了
1.第一题
编写 MapReduce 程序,实现以下功能:将 user_info.csv 数据的分隔符“,”转换为“|”,输出文件到 HDFS,然后 在在控制台按顺序打印输出前 10 条数据
MapReduce代码
package org.example;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; 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.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException;
public class task01 { public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "task01"); job.setJarByClass(task01.class); job.setMapperClass(taskMapper.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); Path outPath = new Path(args[1]); FileSystem fileSystem = outPath.getFileSystem(conf); if (fileSystem.exists(outPath)) { fileSystem.delete(outPath, true); } FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } private static class taskMapper extends Mapper<Object, Text, Text, NullWritable>{ private static Text text = new Text(); @Override protected void map(Object key, Text value, Mapper<Object, Text, Text, NullWritable>.Context context) throws IOException, InterruptedException { text.set(value.toString().replaceAll(",", "|")); context.write(text, NullWritable.get()); } } }
|
2.第二题
编写 MapReduce 程序,实现以下功能: 对于 order_status 这一字段统计每种状态的订单总数,将结果写 入 HDFS,在控制台读取 HDFS 文件
(步骤和上面一样,注意:类名不一样还有定义的名称)
MapReduce代码
import java.io.IOException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class OrderStatusMR {
public static class Map extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text status = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] fields = line.split(","); if (fields.length >= 20) { String order_status = fields[4]; status.set(order_status); context.write(status, one); } } }
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int count = 0; for (IntWritable value : values) { count += value.get(); } result.set(count); context.write(key, result); } }
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "OrderStatusMR"); job.setJarByClass(OrderStatusMR.class); job.setMapperClass(Map.class); job.setReducerClass(Reduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
|
最后一步运行JAR环境包
hadoop jar jar包名 idea里面java类名 /csv文件 /随意起一个输出结果文件名
# 完整的语句 hadoop jar /root/file2_1.jar org.example.task01 /user_info.csv /file2_1_out
|