1. 在awk 中mapper的時候我們經常會合並不同的文件,取我們想要的不同的字段。
awk -F "\t" ' { filename = ENVIRON["mapreduce_map_input_file"]; if (index(filename, "xxxx") > 0) { // xxx } else { //xxxx } }
這樣來取文件的名字,來判斷當前處理的行屬於哪個文件,以此進行相應的處理。
2. 在hadoop 中我們經常需要對兩個文件做一個join操作,即取兩個文件的交集,或者在一個集合中過濾掉特定的集合,如果這個一個集合很小, 我們可以把這個集合加入到一個字典中,然後過濾, 在mapper 中這麼寫。
awk -F "\t" -v file=${smail_set} ' BEGIN{ while (getline < file > 0) { dict[$1] = 1; } } { if($1 in dict) //xxxx else print xxxx } '
reducer 直接 uniq 即可
3. 如果兩個集合做 join 或者補集的操作,那麼只能對集合打標籤,在mapper中我們這麼寫:
awk -F "\t" ' { filename = ENVIRON["mapreduce_map_input_file"]; if (index(filename, "xxxx") > 0) { print $1"\t0\t"$0 } else { print $1"\t1\t"$0 } }
第二列 一個0 一個1 用$1 讓他們combine的時候到一起去,結合shuffle時候的二次排序,可以搞定