Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark 有效地减少不在另一个RDD中忽略密钥的问题?_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 有效地减少不在另一个RDD中忽略密钥的问题?

Apache spark 有效地减少不在另一个RDD中忽略密钥的问题?,apache-spark,pyspark,Apache Spark,Pyspark,我在pyspark中收集了大量数据。格式是键-值对,我需要执行reducebykey操作,但忽略其键不在我也拥有的“有趣”键的RDD中的所有数据 我在上找到了一个解决方案,利用subtractbykey操作来实现这一点。它可以工作,但由于集群内存不足而崩溃。我无法通过调整设置来改变这一点,所以我希望有一个更有效的解决方案 我的解决方案适用于较小的数据集: # The keys I'm interested in edges = sc.parallelize([("a", "b"), ("b",

我在pyspark中收集了大量数据。格式是键-值对,我需要执行reducebykey操作,但忽略其键不在我也拥有的“有趣”键的RDD中的所有数据

我在上找到了一个解决方案,利用subtractbykey操作来实现这一点。它可以工作,但由于集群内存不足而崩溃。我无法通过调整设置来改变这一点,所以我希望有一个更有效的解决方案

我的解决方案适用于较小的数据集:

# The keys I'm interested in
edges = sc.parallelize([("a", "b"), ("b", "c"), ("a", "d")])
# Data containing both interesting and uninteresting stuff
data1 = sc.parallelize([(("a", "b"), [42]), (("a", "c"), [60]), (("a", "d"), [13, 37])])
data2 = sc.parallelize([(("a", "b"), [43]), (("b", "c"), [23, 24]), (("a", "c"), [13, 37])])
all_data = [data1, data2]

mask = edges.map(lambda t: (tuple(t), None))
rdds = []
for datum in all_data:
    combined = datum.reduceByKey(lambda a, b: a+b)
    unwanted = combined.subtractByKey(mask)
    wanted = combined.subtractByKey(unwanted)
    rdds.append(wanted)

edge_alltimes = sc.union(rdds).reduceByKey(lambda a,b: a+b)
edge_alltimes.collect()
根据需要,这将输出[('a','d'),[13,37],('a','b'),[42,43],('b','c'),[23,24])] (即,“有趣的”关键元组的数据已合并,其余的已删除)。 我将数据放在多个RDD中的原因是为了模拟集群上的行为,因为集群的大小,我无法同时加载所有数据。
任何帮助都会很好。

带有join的示例。一个小缺点是,在连接之前需要有对的RDD,并且在连接之后需要剥离额外的数据

import org.apache.spark.{SparkConf, SparkContext}

object Main {

  val conf = new SparkConf().setAppName("myapp").setMaster("local[*]")
  val sc = new SparkContext(conf)

  def main(args: Array[String]): Unit = {

    val goodKeys = sc.parallelize(Seq(1, 2))
    val allData = sc.parallelize(Seq((1, "a"), (2, "b"), (3, "c")))


    val goodPairs = goodKeys.map(v => (v, 0))

    val goodData = allData.join(goodPairs).mapValues(p => p._1)

    goodData.collect().foreach(println)
  }
}
输出:

(1,a)
(2,b)

您正在重新实现
groupByKey
——几乎总是一个坏主意。为什么减法之后再减法?这没有任何意义。您能澄清一下如何使用groupByKey操作实现这一点吗?你怎么才能只保留想要的钥匙呢?一般来说,我认为有两种方法。第一个-如果所需密钥的集合相对较小-您可以
播放该集合,然后在还原密钥之前执行
过滤。第二-如果所需密钥的集合很大-您可以对密钥使用
join
操作(在这种情况下,密钥集合必须只有唯一的密钥)。它太大,无法广播。我不清楚“对键使用联接操作”是什么意思。你能给出一个例子来实现这一点吗?@ahura-我在答案中添加了Scala代码。