按值PySpark

时间:2016-11-21 18:26:54

标签: apache-spark mapreduce pyspark spark-dataframe rdd

我正在使用PySpark而我正在寻找一种方法来检查:

对于给定的check_number = 01

如果rdd1中第三个元素的值不包含check_number ==>从rdd2 ..

获取有关此check_number的所有信息

鉴于:

rdd1 = sc.parallelize([(u'_guid_F361IeVTC8Q0kckDRw7iOJCe64ELpRmMKQgESgf-uEE=',
                        u'serviceXXX',
                        u'testAB_02',
                        u'2016-07-03')])

假设第一个元素是ID,第二个是服务名称,第三个是测试名称,ID,第四个元素是日期。

rdd2 = sc.parallelize([(u'9b023b8233c242c09b93506942002e0a',
                        u'01',
                        u'2016-11-02'),

                       (u'XXXX52547412558933nnBlmquhdyhM',
                        u'02',
                        u'2016-11-04')])

假设第一个元素是ID,第二个元素是测试ID,最后一个元素是日期。

所以,我的rdd1 testAB_02中存在与我的check_number不匹配的内容(因此服务名称必须以check_number' s结尾)。我的目标是获取rdd2的所有行,01作为测试ID。此处的预期输出必须为:

[(u'9b023b8233c242c09b93506942002e0a',
  u'01',
  u'2016-11-02')

这是我的代码:

def update_typesdecohorte_table(rdd1, rdd2):

    if rdd1.filter(lambda x : (re.match('.*?' + check_number, x[2]))).isEmpty() is True:

        new_rdd2 = rdd2.filter(lambda x : x[1] == check_number)

    else:

         pass

    return new_rdd2

new_rdd2 = update_typesdecohorte_table(rdd1, rdd2)

Wich给出:

[(u'9b023b8233c242c09b93506942002e0a', u'01', u'2016-11-02')]

此代码有效,但我不喜欢这种方法..最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您想从rdd2获取rdd1中没有匹配元素的所有记录,您可以使用cartesian

new_rdd2 = rdd1.cartesian(rdd2)
    .filter(lambda r: not r[0][2].endswith(r[1][1]))
    .map(lambda r: r[1])

如果你的check_number是固定的,那么在末尾过滤这个值:

new_rdd2.filter(lambda r: r[1] == check_number).collect()

但是如果你的check_number是固定的并且两个RDD都很大,那么它会比你的解决方案慢,因为它需要在连接期间对分区进行混洗(你的代码只执行非混洗转换)。