以下は、特定の列の数を見つけるためのPythonのmap-reduceスクリプトです。入力ファイルは次のとおりです。
301838690844557314|#awkwarddate first date at quiznoes|334910568|gabriellarichh|20130213|awkwarddate|Point|40.456664|-74.265167
301838679280861185|RT @jimmyfallon: Ended my very first date by saying, "Take it easy." And then my dad drove me home. #awkwarddate|618516844|heyitsbrooke456|20130213|awkwarddate|NULL|NULL|NULL
301838678026768384|RT @jimmyfallon: Hashtag game! Tweet out a funny, weird, or embarrassing story about a date you've been on and tag w/ #awkwarddate. Could be on our show!|116973704|VegasPhotog|20130213|awkwarddate|NULL|NULL|NULL
マップリデューススクリプトは次のとおりです。マップコードは次のとおりです。
import sys
def read_input(file):
for line in file:
# split the line into words
yield line.split('|')
def main(separator='|'):
# input comes from STDIN (standard input)
data = read_input(sys.stdin)
for words in data:
# write the results to STDOUT (standard output);
# what we output here will be the input for the
# Reduce step, i.e. the input for reducer.py
#
# tab-delimited; the trivial word count is 1
if len(words)==9:
for word[5] in words:
print '%s%s%d' % (word[5], separator, 1)
if __name__ == "__main__":
main()
削減コードは次のとおりです。
from itertools import groupby
from operator import itemgetter
import sys
def read_mapper_output(file, separator='|'):
for line in file:
yield line.rstrip().split(separator, 1)
def main(separator='|'):
# input comes from STDIN (standard input)
data = read_mapper_output(sys.stdin, separator=separator)
# groupby groups multiple word-count pairs by word,
# and creates an iterator that returns consecutive keys and their group:
# current_word - string containing a word (the key)
# group - iterator yielding all ["<current_word>", "<count>"] items
for current_word, group in groupby(data, itemgetter(0)):
try:
total_count = sum(int(count) for current_word, count in group)
print "%s%s%d" % (current_word, separator, total_count)
except ValueError:
# count was not a number, so silently discard this item
pass
if __name__ == "__main__":
main()
上記のスクリプトをhadoopで実行すると、次のエラーが発生します。
failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201302281754_0001_m_000000
6列目(awkwarddate)のカウントを取得したいです。助けていただければ幸いです。前もって感謝します