Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将一个RDD中的值与另一个RDD中的值进行部分/完全匹配_Scala_Apache Spark_Apache Spark Sql_Pattern Matching - Fatal编程技术网

Scala 将一个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")

我有两个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")
       ('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|
+---------+-----+