Map-Reduceを使用して、各年の売上数と各年の総売上を確認します

実験環境:Linux環境、python3環境

実験要件:

1. map.pyファイルを作成し、次の点に注意してください。

1.空白行の処理については、line [0]!= ''を判断できます。

2.時間データには年、月、日が含まれ、年を傍受するだけで済みます

3.注文データの各行は1として数えることができます

4.ターゲット出力フォーマット:年、金額

2.自分でreduce.pyコードを書いて、ポイントに注意してください

1.データの行数はトランザクション数と見なすことができます

2.出力は年でソートする必要があります

3.ターゲット出力フォーマット:年、トランザクション数-合計

(合計金額は、13572468.98-> 13572.46kのように、小数点以下2桁のkに変換する必要があります)

実験的なアイデア:

1.マップリンク:マッピング、つまり、処理するフィールドを選択します。この質問の実験要件から判断すると、マップによって処理される最後のキー値は次のようになります。(k1、v1)=(年、金額)
2。リンクを減らす:プロトコル、同じキーワードのデータが処理されます。最終的にreduceによって処理されるキーと値のペアは次のとおりです。(k2、v2)=(年、(トランザクション数-合計))

機能的なリンクを実現する

マップ機能の実装

#map功能的实现
import sys
   
for line in sys.stdin:
           if line[0]!="" :
            col = line.strip().split(',')
            col1=col[2].strip().split('-')
            col[2]=col1[0]
            print(col[2],',',col[6])

リデュース機能の実装

#reduce功能的实现
#!/bin/env python
# encoding: utf-8
from operator import itemgetter
import itertools
import sys


def read_mapper_output(file, separator = ','):
    for line in file:
       yield line.rstrip().split(separator,1)
stdin_generator=read_mapper_output(sys.stdin, ',')
for year, sals in itertools.groupby(stdin_generator,itemgetter(0) ):
  count=0
  total_sal=0
  for year,cur_sal in sals:
      count = count+1
      total_sal=total_sal + float(cur_sal)
  print(year,'\t',count,'\t','%.2f'%(total_sal/1000))

運用結果

実行結果の
マップ関数を使用して結果を実行し、最初の10行を表示します
マップローカルパイプラインテストマップコード

cat sales.csv | python map.py 

Map-reduce操作の結果
総実行結果
map-reduceローカルパイプラインテスト:

cat sales.csv | python map.py | sort -k 1 | python reduce.py

HadoopクラスターにMapReduce関数を実装する

1.コマンドラインウィンドウを開き、Hadoopを起動します

cd /opt/hadoop/sbin
hadoop namenode -format #格式化名称节点
start-all.sh #启动服务器
jps #查看进程

2.HDFSにディレクトリ/ 001 / inputを作成し、データファイルをHDFSにアップロードします

hdfs dfs -mkdir -p /001/input #创建文件夹

hdfs dfs -put sales.csv /001/input #上传文件到集群文件夹里
hdfs dfs -ls /001/input #查看是否上传成功

3、新しいXX.shファイルを作成します

$HADOOP_HOME/bin/hadoop jar \
$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
-D stream.non.zero.exit.is.failure=false \ #对于错误不报出
-D mapred.job.name="streaming_count" \ #作业的名称的命名,在浏览器输入:localhost:8088/,可以看到作业名。
-D mapred.job.priority=HIGH \ #先执行优先权高的作业 
-files "/home/ubuntu/PycharmProjects/untitled/map.py,/home/ubuntu/PycharmProjects/untitled/reduce.py" \
-input /001/input/sales.csv \
-output /001/input/out001 \
-mapper "python3 map.py" \
-reducer "python3 reduce.py" 

次に、XX.shフォルダーの下のコマンドウィンドウを開き、次のコードを入力して結果を実行します。

sh XX.sh

上記のコマンドを実行した結果は次のとおりです。コマンドラインを実行した結果

おすすめ

転載: blog.csdn.net/qq_45578279/article/details/109450305