我正在玩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,我可以执行公司特定的分析,而不是。 我的问题是,对于我的场景,他们还有其他更好的方法吗?
答案 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
希望这有帮助!!!