Scala 将一个RDD中的值与另一个RDD中的值进行部分/完全匹配
我有两个RDD,其中第一个RDD有表单的记录Scala 将一个RDD中的值与另一个RDD中的值进行部分/完全匹配,scala,apache-spark,apache-spark-sql,pattern-matching,Scala,Apache Spark,Apache Spark Sql,Pattern Matching,我有两个RDD,其中第一个RDD有表单的记录 RDD1 = (1, 2017-2-13,"ABX-3354 gsfette" 2, 2017-3-18,"TYET-3423 asdsad" 3, 2017-2-09,"TYET-3423 rewriu" 4, 2017-2-13,"ABX-3354 42324" 5, 2017-4-01,"TYET-3423 aerr") RDD2 = ('mfr1',"ABX-3354")
RDD1 = (1, 2017-2-13,"ABX-3354 gsfette"
2, 2017-3-18,"TYET-3423 asdsad"
3, 2017-2-09,"TYET-3423 rewriu"
4, 2017-2-13,"ABX-3354 42324"
5, 2017-4-01,"TYET-3423 aerr")
RDD2 = ('mfr1',"ABX-3354")
('mfr2',"TYET-3423")
第二个RDD有表单的记录
RDD1 = (1, 2017-2-13,"ABX-3354 gsfette"
2, 2017-3-18,"TYET-3423 asdsad"
3, 2017-2-09,"TYET-3423 rewriu"
4, 2017-2-13,"ABX-3354 42324"
5, 2017-4-01,"TYET-3423 aerr")
RDD2 = ('mfr1',"ABX-3354")
('mfr2',"TYET-3423")
我需要找到RDD1中的所有记录,其中RDD2中的每个值都与RDD1的第3列到RDD2的第2列匹配,并获得计数
对于本例,最终结果将是:
ABX-3354 2
TYET-3423 3
做这件事的最佳方法是什么?下面是如何得到结果的
val RDD1 = spark.sparkContext.parallelize(Seq(
(1, "2017-2-13", "ABX-3354 gsfette"),
(2, "2017-3-18", "TYET-3423 asdsad"),
(3, "2017-2-09", "TYET-3423 rewriu"),
(4, "2017-2-13", "ABX-3354 42324"),
(5, "2017-4-01", "TYET-3423 aerr")
))
val RDD2 = spark.sparkContext.parallelize(Seq(
("mfr1","ABX-3354"),
("mfr2","TYET-3423")
))
RDD1.map(r =>{
(r._3.split(" ")(0), (r._1, r._2, r._3))
})
.join(RDD2.map(r => (r._2, r._1)))
.groupBy(_._1)
.map(r => (r._1, r._2.toSeq.size))
.foreach(println)
输出:
(TYET-3423,3)
(ABX-3354,2)
希望这有帮助 我发布了两个使用Spark SQL的解决方案,更加关注给定文本中搜索字符串的精确模式匹配 1:使用交叉连接 2:使用广播变量 两种解决方案的结果相同
从RDD1创建新列,提取第三列的第一部分。然后,按该列分组并仅在RDD2中过滤。但这将使得在继续之前必须从RDD1收集所有元素。这在流媒体环境中是一个难题,假设您的RDD可以包含大量数据。也许使用一个稳定的Bloom过滤器可以在这里有所帮助,如本文所述:嗯……看起来我不能使用交叉连接,因为我使用的是Spark 1.6。我发现连接2个RDD非常非常慢。拥有一个300mb的RDD和另一个1MB的RDD需要几分钟的时间来加入、分组并最终打印回终端
result.show()
+---------+-----+
| key|count|
+---------+-----+
|TYET-3423| 3|
| ABX-3354| 2|
+---------+-----+