如何在map函数中创建RDD

时间:2016-12-28 06:18:11

标签: apache-spark

我有密钥/值对的RDD,对于每个密钥,我需要调用一些接受RDD的函数。所以我尝试使用sc.parallelize(value)方法在RDD.Map和内部地图创建RDD并将此rdd发送到我的函数,但由于Spark不支持在RDD中创建RDD,因此无效。

你能否就这种情况向我建议任何解决方案?

我正在寻找解决方案,如下面的线程所示,但我遇到的问题是我的钥匙没有固定,我可以有任意数量的钥匙。
How to create RDD from within Task?

由于

2 个答案:

答案 0 :(得分:1)

听起来不太对劲。如果函数需要处理键值对,它应该接收该对作为参数,而不是RDD。

但是如果你真的想要将RDD作为参数发送,而不是在链操作中,你可以在预处理后创建一个引用并将该引用发送给该方法。

答案 1 :(得分:0)

不,你不应该在RDD中创建RDD。

取决于数据的大小,可能有两种解决方案:

1)如果有很多键,每个键没有太多值。将接受RDD的函数转换为接受Iterable的函数。然后你可以做一些像

这样的事情
// rdd: RDD[(keyType, valueType)]
rdd.groupByKey()
  .map { case (key, values) =>
    func(values)
  }

2)如果键很少,每个键都有很多值。然后你不应该做一个组,因为它会收集执行者的一个键的所有值,这可能会导致OutOfMemory。相反,为每个键运行一个作业,如

rdd.keys.distinct().collect()
  .foreach { key =>
    func(rdd.filter(_._1 == key))         
  }