python join函数的用法

时间:2015-08-19 07:33:00

标签: python hadoop join

我使用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功能吗?

2 个答案:

答案 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