我有密钥/值对的RDD,对于每个密钥,我需要调用一些接受RDD的函数。所以我尝试使用sc.parallelize(value)方法在RDD.Map和内部地图创建RDD并将此rdd发送到我的函数,但由于Spark不支持在RDD中创建RDD,因此无效。
你能否就这种情况向我建议任何解决方案?
我正在寻找解决方案,如下面的线程所示,但我遇到的问题是我的钥匙没有固定,我可以有任意数量的钥匙。
How to create RDD from within Task?
由于
答案 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))
}