Spark迭代RDD按键

时间:2017-01-30 09:47:20

标签: python apache-spark pyspark rdd

我要开发一个Spark应用程序,我必须使用Spark 1.3,所以我不能使用窗口函数。我选择迭代单组元素,按键rdd创建分组。到目前为止我找到的解决方案是收集密钥,然后使用查找(密钥)获取相应的RDD。我知道我的方法非常低效,但我不知道如何应用我的函数将RDD转换为列表然后以另一种方式返回另一个列表。

logon_dhcp = logons.map(lambda logon: (logon.user, (logon.dhcpscopename, logon.city, logon.timestamp)))
logon_dhcp = logon_dhcp.groupByKey()

dhcp_change_list = []
for key in logon_dhcp.keys().collect():
    new_list = dhcp_changed(key,logon_dhcp.lookup(key))
    dhcp_change_list = list(set().union(dhcp_change_list,new_list))

def dhcp_changed(key,group):
    values = list(group[0])
    values_sorted = sorted(values, key=lambda tup: tup[2])
    prevCity = None
    prevValue = None
    prevTime = None
    res = list()
    for value in values_sorted:
        if prevCity != None and prevCity != value[1] and notEnoughTime(prevTime,value[2]):
            res.append((key, prevTime.strftime('%Y-%m-%d %H:%M:%S'), prevCity, value[2].strftime('%Y-%m-%d %H:%M:%S'), value[1]))
        prevCity = value[1]
        prevTime = value[2]
        prevValue = value
    return res

我如何使用aggregateByKey()做同样的事情?

1 个答案:

答案 0 :(得分:0)

好的,一个简单的地图可以工作,因为RDD已经是格式(key,IterableList)

result = logon_dhcp.map(lambda x: dhcp_changed(x))

将功能修改为:

def dchp_changed(group):
    key = str(group[0])
    values = list(group[1])

欢迎任何提高我的代码性能的建议