PySpark IPython - 使用不同的密钥将RDD减少为新的RDD

时间:2016-04-08 16:10:47

标签: python apache-spark ipython pyspark

首先,我是Spark和Python的新手。我正在尝试将RDD(弹性分布式数据集)转换为另一个。

输入RDD是:

 (u'Task1', (u'James', 10)),
 (u'Task1', (u'James', 15)),
 (u'Task1', (u'James', 18)),
 (u'Task1', (u'James', 11)),
 (u'Task1', (u'Oliver', 10)),
 (u'Task1', (u'Oliver', 15)),
 (u'Task2', (u'Oliver', 18)),
 (u'Task2', (u'Oliver', 11)),

现在我正在尝试构建一个函数,输出每个人的小时数,无论任务如何:

def extract_time_tracking(time_bookings): 
    ???
    return (person, total_hours)
time_trackings_sum = input_RDD.???(extract_time_tracking)

输出应为:

 (u'James', 54), # has been working on Task1 only
 (u'Oliver', 54), # has been working on Task1 and Task2

我正在使用PySpark IPython。我在考虑combineByKey或reduceByKey,但他们总是使用相同的密钥。但在我的情况下,结果键与输入键不同?!?!?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用map函数转换对象,以便元组的第一个元素是您想要的键。因为你不关心任务,所以你可以完全放弃它。

input_RDD.map(lambda x: x[1]).reduceByKey(lambda x,y: x+y)

如果以后想要简单地移动键,你会做一个更复杂的地图:

input_RDD.map(lambda x: (x[1][0],(x[0],x[1][1]))

答案 1 :(得分:0)

def extract_time_tracking(time_bookings): 
val splits = rec.split(",")
val person = splits(1).replaceAll(" \\(u'", "").replaceAll("'", "")
val total_hours = splits(2).replaceAll("\\)", "").trim().toInt
return (person, total_hours)


input_RDD.map(extract_time_tracking).reduceByKey

我使用scala,所以请检查语法。