Spark:subtractByKey问题(pyspark)

时间:2016-11-22 12:20:42

标签: pyspark

我有一些与subtractByKey有关的问题。

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

client_id   emails

4A85FD8E-197D-2AE3-B939-A527AFF16A04    imperdiet.non.vestibulum@mon***tur.com 
D48D530C-CF68-DAF1-18F0-E0A0A03F3E06    rutrum.urna@estm***ncus.net:facilisis@i****m.ca
40815230-25DC-9EA0-01D1-2706B4B56958    iaculis.nec.eleifend@gr****nc.net 
...

和第二个:(仅限邮件)

pharetra@P****s.com  
ut.aliquam@o****m.org  
erat@a****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'), ... ]

我想删除第一个文件中的客户端,这些客户端的邮件在第二个文件中但是没有用。

1 个答案:

答案 0 :(得分:0)

  

注意:我对pyspark不是很熟悉,但是火花api应该是。{1}}   相同。

首先,您应该将电子邮件作为密钥

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

这会给你一个

的rdd
[(4A85FD8E-197D-2AE3-B939-A527AFF16A04,imperdiet.non.vestibulum@mon***tur.com)]

然后由于可能有多封电子邮件,您应该执行flatMapValues()

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

这会给你一对rdd,每个只包含一封电子邮件

现在您可以切换键和值

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

现在你得到一个rdd,它使用用户电子邮件作为密钥,UUID作为值 比如

[(imperdiet.non.vestibulum@mon***tur.com, 4A85FD8E-197D-2AE3-B939-A527AFF16A04)]

现在您应该找到文件2中包含哪个UUID的电子邮件,为此您应该将第二个文件作为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