2016-11-22 102 views
0

我有一些与subtractByKey有关的问题。spark:subtractByKey问题(pyspark)

我有2个文件: 第一个是这样的:(客户端ID +客户端邮件)

client_id emails 

4A85FD8E-197D-2AE3-B939-A527AFF16A04 [email protected]***tur.com 
D48D530C-CF68-DAF1-18F0-E0A0A03F3E06 [email protected]***ncus.net:[email protected]****m.ca 
40815230-25DC-9EA0-01D1-2706B4B56958 [email protected]****nc.net 
... 

,而第二个:(仅邮件)

[email protected]****s.com 
[email protected]****m.org 
[email protected]****e.edu 
.... 

一些第一个文件中的行可以具有2(或更多)这种格式的邮件:

mail:mail 

我做了什么:

*test1=sc.textFile("file1") 
*test2=sc.textFile("file2") 
*test3=test1.subtractByKey(test2) 

,其结果是...:

[(u'A', u'B'), (u'A', u'D'), (u'A', u'1'), (u'A', u'D'), (u'A', u'D'), (u'A', u'B'), (u'A', u'F'), (u'A', u'E'), (u'A', u'9'), (u'A', u'5'), (u'A', u'9'), (u'A', u'6'), (u'c', u'l'), (u'E', u'8'), (u'E', u'4'), (u'E', u'6'), (u'E', u'6'), (u'E', u'7'), (u'E', u'5'), (u'E', u'5'), (u'E', u'5'), (u'E', u'2'), (u'E', u'8'), (u'C', u'2'), (u'C', u'5'), (u'C', u'6'), (u'C', u'C'), (u'C', u'E'), (u'C', u'3'), (u'C', u'F'), (u'C', u'4'), (u'C', u'B'), (u'C', u'F'), (u'C', u'F'), (u'C', u'8'), (u'C', u'0'), (u'1', u'D'), (u'1', u'2'), (u'1', u'3'), (u'1', u'8'), (u'1', u'0'), (u'1', u'F'), ... ] 

我想删除的客户谁在第二个文件有他们的邮件的第一个文件,但它不起作用。

+0

你最好以'代码'格式编辑你的问题,因为我看到的是很混乱 – armnotstrong

+0

它没有代码...除了3行代码格式。 – Ezay

+0

这是第一个可能包含多个电子邮件的文件,对吗? – armnotstrong

回答

0

注:我不是很熟悉pyspark但火花API应该是 相同。

首先,您应电子邮件为重点

rdd1=sc.textFile("file1").map(lambda line: (line.split(" ")[0], line.split(" ")[1]))

这会给你的

[(4A85FD8E-197D-2AE3-B939-A527AFF16A04,[email protected]***tur.com)] 

然后RDD因为可能会有多邮件,你应该做一个flatMapValues()

rdd2 = rdd1.flatMapValues(lambda email: email.split(":"))

这会给你一双RDD,每一个只包含一个电子邮件

现在你可以切换

rdd3=rdd2.map(lambda kv: (kv[1], kv[0])) 

现在你会得到一个RDD键和值,使用用户的电子邮件作为主要的和UUID作为一个值,如

[([email protected]***tur.com, 4A85FD8E-197D-2AE3-B939-A527AFF16A04)] 

现在你应该找哪家UUID的电子邮件中包含文件2,要做到这一点,你应该加载第二个文件作为RDD :

secondRdd = sc.textFile("file2").map(lambda line: (line, 1)) 

并做一个join并调整连接结果rdd。

rdd4 = rdd3.join(secondRdd).map(lambda kv: (kv[1][0], kv[0])) 

如果一切是正确的,现在你应该得到一个RDD是作为(UUID, email)的格式,它代表所有其电子邮件出现在file2用户,

那么你可以做一个subtractByKey()rdd1是我们最初得到。

+0

好,非常感谢。如果我可以添加一个问题:如果电子邮件位于file2中,它将删除客户端。好的,但如果客户有2封邮件,它是否会删除其中一个或两个邮件? (我猜你的平板地图是否重复客户端?) – Ezay

+0

你应该注意到,'rdd1'还没有flatMap呢,是的,我想如果有重复'UUID','subtractByKey()'会[全部缓解]( https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html#tbl-pair-two-transformations) – armnotstrong