内部加入Pyspark进行队列研究

时间:2016-10-31 12:21:19

标签: python-2.7 join apache-spark pyspark rdd

我正在尝试建立一个队列研究来跟踪应用内用户行为,我想问一下当我使用.join()时我是否知道如何在pyspark中指定条件 鉴于:

rdd1 = sc.parallelize ([(u'6df99638e4584a618f92a9cfdf318cf8',
    ((u'service1',
      u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A',
      u'2016-02-08',
      u'2016-39',
      u'2016-6',
      u'2016-2',
      '2016-10-19'),
     (u'service2',
      u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A',
      u'1',
      u'67.0',
      u'2016-293',
      u'2016-42',
      u'2016-10',
      '2016-10-19')))])


rdd2 = sc.parallelize ([(u'6df99638e4584a618f92a9cfdf318cf8',
    ((u'serice1',
      u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A',
      u'2016-02-08',
      u'2016-39',
      u'2016-6',
      u'2016-2',
      '2016-10-20'),
     (u'service2',
      u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A',
      u'10',
      u'3346.0',
      u'2016-294',
      u'2016-42',
      u'2016-10',
      '2016-10-20')))])

这两个rdds代表有关用户的信息,其中包括' 6df99638e4584a618f92a9cfdf318cf8'作为ID,以及谁在2016-10-19和2016-10-20登录了服务1和service2。我的目标是加入我的两个rdds,每个rdds包含至少20 000行。所以它必须是一个内部联接。真正的目标是让所有已登录的用户登录2016-10-19'并且还登录于2016-10-20。更具体地说,我的最终目标是得到结果,这里是rxemple,在内部连接之后,只是rdd2的内容​​。

预期产出:

    [(u'6df99638e4584a618f92a9cfdf318cf8',
((u'serice1', u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A', u'2016-02-08', u'2016-39', u'2016-6', u'2016-2', '2016-10-20'), 
(u'service2', u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A', u'10', u'3346.0', u'2016-294', u'2016-42', u'2016-10', '2016-10-20'))
) ] 

一个简单的连接 rdd1.join(rdd2)在逻辑上给我一个RDD,其中包含与两个rdds匹配的所有元素对。 leftOuterJoin或rightOuterJoin也不适合我的土地,因为我想要一个内连接(只是已经存在于rdd1和rdd2中的ID)..

预期输出:假设我们有两个词:dict1 = {' a':' man',' b':女人,' c& #39;:' baby'}和dict2 = {' a':' Zara'' x':芒果,' y':' Celio'}。预期输出必须是:output_dict = {' a':' Zara'}。 '一个' (键)已经存在于dict 1中,我想要的是来自dict2的关键值!

它试图这样做:

rdd1.map(lambda (k, v) : k).join(rdd2)

这段代码给了我一个空的rdd。

enter image description here

怎么办? PS:我必须处理rdds,而不是数据帧!所以我不想将我的rdds转换为DataFrames:D 任何帮助赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

因此,您正在寻找rdd1和rdd2的连接,它将仅从rdd2获取键和值:

rdd_output = rdd1.join(rdd2).map(lambda (k,(v1,v2)):(k,v2))

结果是:

print rdd_output.take(1)

[(u'6df99638e4584a618f92a9cfdf318cf8', (
(u'serice1', u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A', u'2016-02-08', u'2016-39', u'2016-6', u'2016-2', '2016-10-20'), 
(u'service2', u'D8B75AA2-7408-49A7-A70D-6442C12E2B6A', u'10', u'3346.0', u'2016-294', u'2016-42', u'2016-10', '2016-10-20')
))]