我有一个简单的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代码的方法,那将是非常不错的。