具有(key,(key2,value))的RDD

时间:2019-01-01 10:55:00

标签: pyspark rdd

我在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(),但是我被困在从值中获取列表。

任何帮助将不胜感激!

1 个答案:

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