Ank*_*kur 1 scala cassandra apache-spark
我在列中有100K +名称.我需要比较它们中的每一个以确定它们是否相同(D'souza,D'souza)或几乎相同(D'Souza,Dsouza).
我尝试将cassandra表读入RDD,并将列的笛卡尔积与其自身形成元组.但由于列大小为100K,这会导致巨大的RDD,最终火花作业就会停止.
以下是我的代码:
val valueRdd = sc.cassandraTable("keyspace", "some_table")
val dataRDD = valueRdd
.map(row => {
(
row
.getStringOption("name")
.get,
}).cache()
val cartesianResult = dataRDD cartesian dataRDD
//Followed by some compare logic. May be soundex or some other library or some fuzzy logic.
Run Code Online (Sandbox Code Playgroud)
这里的问题是笛卡尔结果将是100K*100K的量级,这是不理想的.有没有更好的方法来做到这一点?
问题陈述是识别给定数据集中的兄弟.数据集中将包含100K +数据.
该列表足够小,您可以将列表转换为广播变量,并让每个节点将它的rdd部分与广播列表进行比较:
val valueRddBC =sc.broadcast(valueRdd.collect())
val similarPairsRdd = valueRdd.flatMap(x =>
valueRddBc.value.filter(y => dist(x,y) > threshold)
.map(y => (x,y)))
Run Code Online (Sandbox Code Playgroud)
100k足够小虽然你可以在驱动程序中完成整个事情(如果你想要的dist函数不是很高,这可能会更快).
如果RDD非常大,您可以将项目映射到某种指纹,以使用诸如LSH(本地敏感散列)之类的策略忽略大多数不相关的项目.这是近似最近邻算法,其给出O(1)以找到最接近的项目.
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |