兩份數據,若干行,若干列。均有相同一列,作爲key。連接,完整顯示兩份數據。
data1.txt
zhangsan man 25 teacher
lisi man 28 police
wangwu man 26 student
guoxiao man 26 salesman
wangmeng women 26 student
huangshi women 28 programmer
zhouchu man 25 manager
yangchao man 27 doctor
data2.txt
zhanghuan liaoning huludao
huangshi liaoning unknown
xutao henan luoyang
guoxiao shanxi datong
zhangchao yunnan qujing
zhangsan known known
wangwu henan luoyang
zhouchu hubei enshi
luopeng sichuan dazho
第一列爲姓名,在每份數據裏都是唯一的,爲唯一鍵。
結果如下所示
huangshi women 28 programmer liaoning unknown
guoxiao man 26 salesman shanxi datong
wangwu man 26 student henan luoyang
zhouchu man 25 manager hubei enshi
Mapper
#!/bin/bash
function get_data_source()
{
#local mapreduce_map_input_file=data2asdf.txt
echo "${mapreduce_map_input_file}" | awk '{
if ($1 ~ "data1")
{
print "data1"
}
else if ($1 ~ "data2")
{
print "data2"
}
}'
return 0
}
function filter()
{
local data_source=`get_data_source`
if [ "${data_source}" == "data1" ]
then
awk 'BEGIN{
OFS = "\t"
}{
print $0 ,1
}END{
}'
elif [ "${data_source}" == "data2" ]
then
awk 'BEGIN{
OFS = "\t"
}{
print $0, 2
}END{
}'
fi
}
filter
Reduce
#!/bin/bash
awk 'BEGIN{
OFS = "\t"
}{
if($NF == 1)
{
print substr($0,1,length($0)-1) > "1.txt"
}
if($NF == 2)
{
print substr($0,1,length($0)-1) > "2.txt"
}
}END{
}'
awk 'BEGIN{
FS = "\t"
OFS = "\t"
}{
if(ARGIND == 1)
{
dict[$1] = $0
}
else if(ARGIND == 2)
{
if($1 in dict)
{
print dict[$1], $2, $3
}
}
}END{
}' 1.txt 2.txt
總結:
streaming框架通過設置環境變量的方式給mapper、reducer程序傳遞配置信息。我們利用mapreducer_map_input_file這一環境變量,可以獲得輸入文件路徑,這樣可以區分Map讀取的數據來自哪一個文件。根據數據來源文件的不同,分別爲Map的輸出數據加後綴標識符。這裏有兩個文件,加上1,2用於區分。
Reducer的輸入數據,每一行最後都有後綴1,2。在每一個Reducer任務裏面,根據後綴不同在當前工作目錄下面,生成兩個臨時文件。這樣對這兩個文件,進行單機版的相同處理即可得到我們需要的交集。