火花:适当的方法来去除的RDD [字符串]的最后一个元素

问题描述 投票:1回答:2

我试图删除RDD [字符串]的最后一个元素。

到目前为止,我这样做:

val n: Long = rdd.count()
val startIndex: Long = n - 1

val lastElem = rdd.zipWithIndex()
  .filter{ case (_, index) => index >= startIndex }
  .keys
  .collect()

val newRdd = rdd.filter(x => !x.equalsIgnoreCase(lastElem(0))).cache()

也就是说,服用RDD的最后一个元素,并将其过滤得到的所有元素少的最后一个。

这是运作良好,但有没有更好的办法做到这一点?

scala performance apache-spark
2个回答
0
投票

有Scala中init功能,让你除了最后一个集合中的所有元素。您可以利用一个

val newRdd = sc.parallelize(rdd.collect().toList.init)

这应该给你新通过删除最后一个元素RDD,比你的方法是收集只能使用一次更好。

和RDD是分布式的,也没有办法知道哪一个是没有它收集到一个节点中的最后字符串。

在这里,我也收集司机节点。您可以使用另一种技术来收集到一个执行者,并使用init功能


0
投票

假设被很好地定义的顺序(有上游没有宽变换和输入源的保证良好限定的要素的顺序)当前的解决方案是,因为它得到一样好。

尤其是你应该避免没有可扩展性和整体无用(如果RDD值的顺序没有明确界定,在collected Array订单价值没有很好地界定为好。)collect

请在使用前一定要了解的局限性。 Quoting the docs

请注意,某些RDDS,如根据groupby()返回,并不能保证在一个分区要素的顺序。因此分配给每个元件的唯一ID不能保证,并且如果RDD重新评估甚至可能改变。如果一个固定的订货要求,以保证同一指标的分配,你应该用排序sortByKey(在RDD)或将其保存到一个文件中。

© www.soinside.com 2019 - 2024. All rights reserved.