mapreduce双键减缩器-python

qlvxas9a  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(295)

这应该很简单,我已经花了几个小时在这个。
示例数据(名称、二进制、计数):

Adam 0 1
Adam 1 1
Adam 0 1
Mike 1 1
Mike 0 1
Mike 1 1

所需的示例输出(名称、二进制、计数):

Adam 0 2
Adam 1 1
Mike 0 1
Mike 1 2

每个名称都需要有自己的二进制密钥0或1。基于二进制键,对count列求和。注意所需输出中的“reduce”。
我已经提供了我的一些代码,我正在尝试做没有列表或字典在减速机。
“”“reducer将名称与其二进制文件一起使用,并且部分计数将它们相加
输入:name\t binary\t pcount
输出:名称\t二进制\t计数
"""

import re
import sys

current_name = None
zero_count, one_count = 0,0

for line in sys.stdin:
    # parse the input
    name, binary, count = line.split('\t')

   if name == current_name:
      if int(binary) == 0:
        zero_count += int(count)

    elif int(binary) == 1:
        one_count += int(count)
else:
    if current_name:
        print(f'{current_name}\t{0} \t{zero_count}')
        print(f'{current_name}\t{1} \t{one_count}')
    current_name, binary, count = word, int(binary), int(count)

print(f'{current_name}\t{1} \t{count}')

由于某些原因,它打印不正确(通过的名字是时髦的)我也不知道最好的方式,通过所有的印刷1\u计数和0\u计数,也显示其二进制标签。
任何帮助都将不胜感激。谢谢!

7rtdyuoh

7rtdyuoh1#

我认为最好使用Pandas图书馆。

import pandas as pd
from io import StringIO
a ="""Adam 0 1
Adam 1 1
Adam 0 1
Mike 1 1
Mike 0 1
Mike 1 1"""

text = StringIO(a)
name, binary, count = [],[],[]

for line in text.readlines():
    a = line.strip().split(" ")
    name.append(a[0])
    binary.append(a[1])
    count.append(a[2])

df = pd.DataFrame({'name': name, "binary": binary, "count": count})
df['count'] = df['count'].astype(int)
df = df.groupby(['name', 'binary'])['count'].sum().reset_index()
print(df)
name    binary  count
0   Adam    0   2
1   Adam    1   1
2   Mike    0   1
3   Mike    1   2

如果您的数据已经在csv或文本文件中。它可以用Pandas来读。

df = pd.read_csv('path to your file')
plicqrtu

plicqrtu2#

压痕不好,处理不好。

import re
import sys

current_name = None
zero_count, one_count = 0,0
i = 0
for line in sys.stdin:
    # parse the input
    name, binary, count = line.split('\t')
    #print(name)
    #print(current_name)
    if(i == 0):
        current_name = name
        i  = i + 1
    if(name == current_name):
        if int(binary) == 0:
            zero_count += int(count)

        elif int(binary) == 1:
            one_count += int(count)
    else:
        print(f'{current_name}\t{0} \t{zero_count}')
        print(f'{current_name}\t{1} \t{one_count}')
        current_name = name
        #print(current_name)
        zero_count, one_count = 0,0
        if int(binary) == 0:
            zero_count += int(count)
        elif int(binary) == 1:
            one_count += int(count)
print(f'{current_name}\t{0} \t{zero_count}')
print(f'{current_name}\t{1} \t{one_count}')

“i”处理第一行输入没有“current\u name”的情况(它只运行一次)。
在else块中,您必须重新初始化'zero\u count'和'one\u count',并对新的'current\u name'进行计算。
我的代码的输出:

Adam    0       2
Adam    1       1
Mike    0       1
Mike    1       2

相关问题