给出这个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值并返回一个购买之前的项目'条件。这是正确的还是可能的?
答案 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)
。