如何将一个RDD拆分为多个RDD并相互比较

时间:2018-07-29 07:35:51

标签: apache-spark pyspark apache-spark-sql rdd

我有如下所示的主RDD

 [(u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 22'),
 (u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 22'),
 (u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 23'),
 (u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 24'),
 (u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 25'),
 (u'Facebook', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 26'),
 (u'Facebook', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 27'),
 (u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 28'),
 (u'google', u'00e293fd-80df-47c2-8762-b96c0b5e71c5', 'week 29'),
 (u'Facebook', u'0532e64a-7163-46a1-92ba-286b2a47bed5', 'week 30')]

我想根据第三列(按星期指数)将其拆分以进行同类群组分析。我想到的一种方法是根据周列将RDD转换为数据帧和分区,并将其保存在文本文件中,然后分别读取并相互比较。有什么更好的方法吗?

2 个答案:

答案 0 :(得分:0)

当这是所有要使用的信息时,很难提供帮助,但是您始终可以创建数据框和do group by或按周汇总操作。并创建要比较的SQL查询。它将在您在注释中给出的示例中起作用。

答案 1 :(得分:0)

我将RDD转换为Dataframe,并通过以下代码按源保存到分区中

cohort_df = cohort.toDF(["source", "userId", "cohortId"])
cohort_df.write.partitionBy("source").csv("cohorts")

然后,我通过按如下所示的函数进行过滤,将RDD分为几周

def week24(row):
    return "week24" == row[1]

week22_rdd, week23_rdd, week24_rdd, week25_rdd, week26_rdd = (cohortGroup_rdd.filter(f).map(lambda f: f[0]).distinct() for f in (week22, week23, week24, week25, week26))

,然后使用两个RDD的交集来比较两个RDD,并获得如下所示的通用ID:

new_rdd = week22_rdd.intersection(week23_rdd)

这是使我前进的最好选择。