pyspark rdd上嵌套循环的有效方法

时间:2018-08-02 01:23:58

标签: python loops apache-spark pyspark rdd

我有一个简单的python字符串列表,如下所示(myTexts)。我想在数组上应用嵌套循环,只返回那些与特定阈值匹配的字符串对。以下是我现有的python代码的示例:

myTexts = ['abc', 'cde', 'ccc', 'efg', 'eee', 'kkk']
someThrehold = 0.5
resultantPairs = []

def LCS(string1, string2):
   #returns a numeric similarity value,x (within range [0,1]) based on 
   #passed strings: string1, string2
   return x


for i in range(len(myTexts)):
     for j in range(len(myTexts)):
         similarityValue = LCS(myTexts[i], myTexts[j])
         if similarityValue >= someThreshold:
             resultantPairs.append((myTexts[i], myTexts[j], similarityValue))
         else: #keeping a flag (-1) 
             resultantPairs.append((myTexts[i], myTexts[j], -1))

因此,我需要在同一数组(myTexts)上应用O(n ^ 2)复杂度的嵌套循环。但是,我找不到任何有效的方法来在pyspark rdd或数据帧中实现相同的代码,因为它们不像顺序方法那样支持直接循环(如上述代码)。

在网上搜索时,我发现了一种通过应用笛卡尔乘积在rdd上进行嵌套循环的可能方法。但是,我发现在rdd或dataframe上的笛卡尔运算非常慢。以下是我当前在rdd上使用笛卡尔积的pyspark代码:

myTexts = sc.parallelize(['abc', 'cde', 'ccc', 'efg', 'eee', 'kkk'])
#following operation is very computation expensive
cartesianTexts = myTexts.cartesian(myTexts)

def myFunction(x):
    similarityValue = LCS(x[0], x[1])
    if similarityValue>= someThrehold:
         return (x[0], x[1], similarityValue)
    else: #keeping a flag (-1) 
         return (x[0], x[1], -1)

resultantPairs = cartesianTexts.map(myFunction) 

即使对于相对较小的数据集,上述实现也会花费太多时间。如果您提出一些加速pyspark代码的方法,那将是非常不错的。

0 个答案:

没有答案