如何为每个键条目获取单独的RDD

时间:2016-07-28 16:34:51

标签: java scala apache-spark java-8 rdd

我正在玩sBookRdd = sourceRDD.filter(new MyFilter("IBM")); sBookRdd = sourceRDD.filter(new MyFilter("APL")); 。我有一个pairRDD,其中 APL,IBM Key ,其交易交易为。像这样的东西(这里提供的虚拟数据)

  

(纽约证券交易所IBM 2001-12-27 122.7 123.93 122.64 123.5 3826200 111.65)

     

(纽约证券交易所APL 2001-12-27 12.75 12.93 12.64 12.5 3826200 11.65)

现在我有一个场景,我需要为每个密钥分别设置RDD。我的直接选择是Function upcell() upcell = ActiveCell.Offset(-1, 0) End Function

=upcell()

如果我为每个公司/ StockName分配RDD,我可以执行公司特定的分析,而不是。 我的问题是,对于我的场景,他们还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:1)

Spark不支持RDD嵌套,因此没有简单的方法可以在没有中间操作的情况下将RDD分解为多个RDD。你应该采取的方法取决于你想要实现的目标。

如果您绝对需要每个密钥的RDD,那么您可以重新分区数据,写入以便每个分区的文件易于识别,然后启动多个作业来处理每个分区。我不推荐这种方法。

如果您可以使用Iterable,则可以使用groupBy或更高效的表兄aggregate。只使用字符串作为值,很难想象为什么迭代不能满足您的需求并且需要RDD ......

您还应该考虑是否可以使用窗口函数(您将按键进行分区)使用dataframe / dataset API完成您需要做的事情。

希望这有帮助!

答案 1 :(得分:0)

RDD是用于封装分布数据(最有可能跨机器)的spark的核心抽象。虽然它支持许多列表/可迭代方法,但使用RDD作为可迭代/列表是错误的。

注意:RDD上的任何转换都是惰性的,对RDD的任何操作都将由执行程序并行执行(可以在相同/不同的jvms&&或||机器中)。

考虑到这一事实,现在如果要求一次处理所有具有相同密钥的记录(假设"纽约证券交易所IBM"),您将不得不做以下事情,我正在写在scala中,你可以找到java等价的东西 -

val input = Array("NYSE IBM 2001-12-27 122.7 123.93 122.64 123.5 3826200 111.65", "NYSE APL 2001-12-27 12.75 12.93 12.64 12.5 3826200 11.65")
val rdd = sc.parallelize(input)
val groupedRdd = rdd.groupBy(line => methodWhichReturnsKeyFromEachLine(line))
groupedRdd.foreach(group=>processGroup(group)) //If you want to process all lines in a group without returning any result
groupedRdd.map(group=>processGroup(group)) //If you want to process all lines in a group and return some result per group

希望这有帮助!!!

相关问题