awk and hadoop之mapper

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時候的二次排序,可以搞定

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