我使用join函数加入hadoop中的python列表。但我发现它与在一台机器上使用join不同。任何人都遇到过这个问题。 代码就是那个
def reducer():
(last_key,last_index,list) = ("","","")
for line in sys.stdin:
line = line.strip()
fields = line.split("\t")
if len(fields) < 3:
continue
cur_key = fields[0]
cur_index = fields[1]
cur_list = fields[2]
if last_key !="" and last_key!=cur_key:
print "%s\t%s\t%s" %(last_key,last_index,list)
list = ""
elif last_index !="" and last_index!=cur_index:
print "%s\t%s\t%s" %(last_key,last_index,list)
list = ""
last_key = cur_key
last_index = cur_index
if list != "":
list = '_'.join(cur_list)
else:
list = cur_list
print "%s\t%s\t%s" %(last_key,last_index,list)
我使用了join而不是“+”,因为它更有效率。但是在hadoop和一台机器上运行时会有不同的结果。如何解决它。
映射器输出是 关键\ TPOS \ t0000000000594720 关键\ TPOS \ t0000000000870960 cat mapper | sort | python reducer.py结果是键\ tpos \ ttt0000000000594720_0000000000870960它是对的 但是在hadoop中,结果是0_0_0_0_0_0_0_0_0_0_8_7_0_9_6_0,很奇怪。 Hadoop不能支持join功能吗?
答案 0 :(得分:1)
我猜这个问题是因为你如何调用join -
list = '_'.join(cur_list)
这将加入列表cur_list,每个元素之间都有_。所以根据你的代码,你得到了正确的结果。
如果你不想在cur_list中的字符串之间有任何内容,那么使用空字符串来加入 -
list = ''.join(cur_list)
答案 1 :(得分:0)
当我在Python 2.7.x安装中读取join
的以下docstring时...
S.join(iterable) -> string
Return a string which is the concatenation of the strings in the
iterable. The separator between elements is S.
...我认为'_'.join('abc')
应始终返回'a_b_c',因为str
对象是可迭代的。这就是我在Python 2.7.x安装中得到的结果。
我会将此list = '_'.join(cur_list)
行替换为:
list += '_' + cur_list