簡體   English   中英

在自定義功能上加入兩個RDD - SPARK

[英]Join two RDDs on custom function - SPARK

是否可以在Spark中將兩個RDD加入自定義函數? 我有兩個大字符串作為鍵的RDD。 我想加入他們不使用經典的Join,而是使用自定義函數:

def my_func(a,b):
    return Lev.distance(a,b) < 2

result_rdd = rdd1.join(rdd2, my_func)

如果不可能,還有其他方法可以繼續使用火花簇的好處嗎? 我寫了這樣的東西,但是pyspark將無法在我的小集群上分配工作。

def custom_join(rdd1, rdd2, my_func):
    a = rdd1.sortByKey().collect()
    b = rdd2.sortByKey().collect()
    i = 0
    j = 0
    res = []
    while i < len(a) and j < len(b):
        if my_func(a[i][0],b[j][0]):
            res += [((a[i][0],b[j][0]),(a[i][1],b[j][1]))]
            i+=1
            j+=1
        elif a[i][0] < b[j][0]:
            i+=1
        else:
            j+=1

    return sc.parallelize(res)

提前致謝(對不起我的英語,因為我是意大利人)

您可以使用笛卡兒,然后根據條件進行過濾。

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
sc = spark.sparkContext
x = sc.parallelize([("a", 1), ("b", 4)])
y = sc.parallelize([("a", 2), ("b", 3)])

def customFunc(x):
    # You may use any condition here
    return x[0][0] ==x[1][0]

print(x.join(y).collect()) # normal join
# replicating join with cartesian
print(x.cartesian(y).filter(customFunc).flatMap(lambda x:x).groupByKey().mapValues(tuple).collect())

輸出:

[('b', (4, 3)), ('a', (1, 2))]
[('a', (1, 2)), ('b', (4, 3))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM