我在pyspark中有一个形式(键,其他东西)的RDD,其中“其他东西”是字段列表。我想获得另一个RDD,它使用字段列表中的第二个键。例如,如果我的初始RDD为:
(User1,1990 4 2 green ...)
(用户1,1990 2 2绿色...)
(User2,1994 3 8蓝色...)
(User1,1987 3 4蓝色...)
我想获得(User1,[(1990,x),(1987,y)]),(User2,(1994 z))
其中x,y,z将是其他字段的汇总,例如x是我在User1和1990中拥有的行数(在这种情况下为两)的计数,而我得到的列表每年有一个元组
我正在从以下位置查看键值函数: https://www.oreilly.com/library/view/learning-spark/9781449359034/ch04.html
但是似乎没有发现任何可以提供和汇总两次的内容:一次用于用户,一年用于。我最初的尝试是使用CombineByKey(),但是我被困在从值中获取列表。
任何帮助将不胜感激!
答案 0 :(得分:0)
您可以使用groupby
执行以下操作:
# sample rdd
l = [("User1", "1990"),
("User1", "1990"),
("User2", "1994"),
("User1", "1987") ]
rd = sc.parallelize(l)
# returns a tuples of count of year
def f(l):
dd = {}
for i in l:
if i not in dd:
dd[i] =1
else:
dd[i]+=1
return list(dd.items())
# using groupby and applying the function on x[1] (which is a list)
rd1 = rd.groupByKey().map(lambda x : (x[0], f(x[1]))).collect()
[('User1', [('1990', 2), ('1987', 1)]), ('User2', [('1994', 1)])]