根据Key的值过滤RDD

时间:2018-02-24 08:57:35

标签: scala apache-spark rdd

我有两个RDD来包装以下数组:

Array((3,Ken), (5,Jonny), (4,Adam), (3,Ben), (6,Rhonda), (5,Johny))

Array((4,Rudy), (7,Micheal), (5,Peter), (5,Shawn), (5,Aaron), (7,Gilbert))

我需要设计一个代码,如果我提供输入为3,我需要返回

Array((3,Ken), (3,Ben))

如果输入为6,则输出应为

Array((6,Rhonda))

我试过这样的事情:

val list3 = list1.union(list2)

list3.reduceByKey(_+_).collect   

list3.reduceByKey(6).collect 

这些都不起作用,任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

鉴于以下情况,您必须自己定义

// Provide you SparkContext and inputs here
val sc: SparkContext = ???
val array1: Array[(Int, String)] = ???
val array2: Array[(Int, String)] = ???
val n: Int = ???

val rdd1 = sc.parallelize(array1)
val rdd2 = sc.parallelize(array2)

您可以使用unionfilter来实现目标

rdd1.union(rdd2).filter(_._1 == n)

由于按键过滤是您可能希望在多种情况下进行的过程,因此将此功能封装在自己的函数中是有意义的。

如果我们可以确保此函数可以在任何类型的键上工作,而不仅仅是Int s。

您可以在旧的RDD API中表达这一点,如下所示:

def filterByKey[K, V](rdd: RDD[(K, V)], k: K): RDD[(K, V)] =
  rdd.filter(_._1 == k)

您可以按如下方式使用它:

val rdd = rdd1.union(rdd2)

val filtered = filterByKey(rdd, n)

让我们更详细地看一下这个方法。

此方法允许包含通用对的filterByKeyRDD,其中第一个项的类型为K,第二个类型的类型为V (来自)。它还接受K类型的密钥,该密钥将用于过滤RDD

然后使用filter函数,该函数将谓词(某种类型的函数 - 在本例中为K - 转换为Boolean)并确保结果RDD仅包含尊重此谓词的项目。

我们也可以将函数体写为:

rdd.filter(pair => pair._1 == k)

rdd.filter { case (key, value) => key == k }

但我们利用_通配符来表达我们想要对此匿名函数的第一个(也是唯一的)参数进行操作的事实。

要使用它,首先parallelize RDDunion,然后调用filterByKey,然后调用<?php $usn=$_GET['usn']; $con=mysqli_connect('localhost','root','','library'); $sql="select count(*) from book_fine where usn='$usn'"; $res=mysqli_query($con,$sql); $row=mysqli_fetch_array($res); if($row[0]>0) { $sql="select * from book_fine where usn='$usn'"; $res=mysqli_query($con,$sql); echo '<html><form><table class="table table-bordered"> <tr> <th><input type="checkbox" name="check_all" id="check_all" value=""/></th> <th>USN</th> <th>Trans No</th> <th>Acc No</th> <th>category</th> <th>description</th> <th>issue_date</th> <th>due_date</th> <th>renewed</th> <th>fine</th> </tr> '; while($row=mysqli_fetch_array($res)){ ?> <tr><td><input type="checkbox" name="selected_id[]" class="checkbox" value="<?php echo $usn; ?>"/></td> <?php echo" <td>".$row[0]."</td> <td>".$row[1]."</td> <td>".$row[2]."</td> <td>".$row[3]."</td> <td>".$row[4]."</td> <td>".$row[5]."</td> <td>".$row[6]."</td> <td>".$row[7]."</td> <td>".$row[8]."</td> </tr></form></html>"; } echo "</table>"; }else{ echo "string"; } 函数,并输入要过滤的数字(如示例中显示。)