如何通过过滤掉一组给定的键来减少一对RDD?

时间:2017-01-12 12:21:07

标签: java python scala apache-spark

我有一对格式为RDD[(String, String)]的RDD和来自文件的键列表。我想要一个RDD,它只包含那些与列表中的键匹配的键值对。我怎样才能实现这一点(最好是Scala)? 谢谢。

3 个答案:

答案 0 :(得分:4)

我猜你可以使用RDD.filter

rdd.filter(yourKeysList.contains(_._1))

Here是使用Scala或Python进行过滤的一些更具描述性的示例。

答案 1 :(得分:2)

这取决于您拥有多少数据。

小型数据集(可以广播)

使用广播变量向每个执行者发送列表,然后使用变量:

进行过滤
val allowedSet = Source.fromFile("filename.txt").getLines.toSet
val allowedBV = sparkContext.broadcast(allowedSet)

val filtered = pairRDD.filter (x => allowedBV.value.contains(x._1))

大数据集

我没有看到加入非对RDD的简单方法,但您可以使用数据集:

val allowedDS = sc.parallelize(allowedSet).toDF("allowedKey").as[String]

然后使用此数据集加入您的数据集:

val joined = pairRDD.toDF("key", "value").join (allowedDS, 'key === 'allowedKey).dropColumn('allowedKey);

或者你可以做这两个RDD的笛卡儿,但它可能很慢

答案 2 :(得分:1)

其实很简单:

<div class="container">

    <div class="row">

    <a href="/blog"><h4>News</h4></a>

      <% blog.forEach(function(blog) { %> // Creates a blog and adds a title, image and body to it
      <div class="col-md-4 col-sm-6">

        <div class="thumbnail">
            <img src="<%= blog.image %>">  //Adds image
        </div>

        <div class="caption">
            <a href="#"><h4><%= blog.title %></h4></a>  //Adds image
        </div>

        <span><%= blog.created %></span>

        <div class="relative">
          <p><%- blog.body %></p>  //Adds body content
          <div class="absolute"></div>
        </div>
        <a href="/blog/<%= blog._id %>">Read More</a>

        </div>

        <% }) %>

    </div>

是的。