Hadoop Mapreducer兩文件數據求交拼接

兩份數據,若干行,若干列。均有相同一列,作爲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任務裏面,根據後綴不同在當前工作目錄下面,生成兩個臨時文件。這樣對這兩個文件,進行單機版的相同處理即可得到我們需要的交集。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章