首先,我是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,但他们总是使用相同的密钥。但在我的情况下,结果键与输入键不同?!?!?
感谢您的帮助。
答案 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,所以请检查语法。