迭代Python Spark中的RDD值

时间:2016-02-17 07:05:44

标签: python apache-spark mapreduce

给出这个python列表,格式如下:(userid,action,itemid,timestamp)和内容:

user_action_list = [('uid1', 'click', 'item1', 1454880986),
                    ('uid1', 'view', 'item1', 1454880984),
                    ('uid1', 'view', 'item2', 1454880984),
                    ('uid1', 'view', 'item3', 1454880984),
                    ('uid1', 'purchase', 'item1', 1454880994),
                    ('uid1', 'purchase', 'item4', 1454880994),
                    ('uid2', 'view', 'item1', 1454880985),
                    ('uid2', 'view', 'item2', 1454880985),
                    ('uid2', 'view', 'item5', 1454880985),
                    ('uid2', 'purchase', 'item2', 1454880995),
                    ('uid3', 'click', 'item5', 1454880985),
                    ('uid3', 'view', 'item6', 1454880985),
                    ('uid3', 'purchase', 'item5', 1454880995),
                    ('uid3', 'purchase', 'item6', 1454880995),
                    ('uid3', 'view', 'item6', 1454880999),
                    ('uid3', 'view', 'item5', 1454881010),
                    ('uid4', 'view', 'item1', 1454880910),
                    ('uid4', 'view', 'item2', 1454880910)]

我想使用spark返回所有直接在任何"购买"之前的所有商品。行动项目。格式应为((userid,itemid),(timestamp,action));返回项目的示例是:((' uid1',' item1'),(1454880986,'点击'))。我的问题是:如何迭代从groupByKey函数返回的对象或列表?

result_rdd = user_action_rdd.map(lambda x: (x[0], (x[1], x[2], x[3]))) \
                                .groupByKey() \
                                .mapValues(lambda x: list(x)) \

return result_rdd.collect()

我的想法是,我应该迭代rdd值并返回一个购买之前的项目'条件。这是正确的还是可能的?

1 个答案:

答案 0 :(得分:1)

有更有效的方法可以处理(尽管groupByKey不太可能)但最简单的方法可能是使用窗口函数:

from pyspark.sql.window import Window
from pyspark.sql.functions import col, lead

df = (sc.parallelize(user_action_list)
    .toDF(["userid", "action", "itemid", "timestamp"]))

w = Window().partitionBy("userid").orderBy("timestamp")

(df
    .withColumn("ind", lead("action", 1).over(w))
    .where(col("ind") == "purchase")
    .drop("ind")
    .show())

## +------+--------+------+----------+
## |userid|  action|itemid| timestamp|
## +------+--------+------+----------+
## |  uid1|   click| item1|1454880986|
## |  uid1|purchase| item1|1454880994|
## |  uid2|    view| item5|1454880985|
## |  uid3|    view| item6|1454880985|
## |  uid3|purchase| item5|1454880995|
## +------+--------+------+----------+

关于在RDD中对分组值进行迭代,您可以简单地传递任意函数而不是lambda x: list(x)