【发布时间】:2017-07-27 11:28:51
【问题描述】:
我有两个序列 A 和 B。我们想生成一个布尔序列,其中 A 中的每个元素都有一个出现在 B 中的子序列。例如:
a = ["abababab", "ccffccff", "123123", "56575656"]
b = ["ab", "55", "adfadf", "123", "5656"]
output = [True, False, True, True]
A 和 B 不适合内存。一种解决方案可能如下:
val a = sc.parallelize(List("abababab", "ccffccff", "123123", "56575656"))
val b = sc.parallelize(List("ab", "55", "adfadf", "123", "5656"))
a.cartesian(b)
.map({case (x,y) => (x, x contains y) })
.reduceByKey(_ || _).map(w => w._1 + "," + w._2).saveAsTextFile("./output.txt")
可以理解,不需要计算笛卡尔积,因为一旦我们找到满足条件的前几个序列,我们就可以停止搜索。以A 的第一个元素为例。如果我们从头开始迭代B,B 的第一个元素是一个子序列,因此输出是True。在这种情况下,我们非常幸运,但一般情况下不需要验证所有组合。
问题是:有没有其他方法可以优化这个计算?
【问题讨论】:
标签: algorithm scala apache-spark bigdata