我使用的火花与sc.textFile(fileLocation)
,需要能够快速下降的第一和最后一行阅读的文本文件(他们可能是一个首或尾)。我发现的好方法返回第一和最后一排,但没有很好的一个删除它们。这可能吗?删除的RDD的第一个和最后一行星火
回答
这样做将是zipWithIndex
,然后用指标筛选出的记录的一种方式0
和count - 1
:
// We're going to perform multiple actions on this RDD,
// so it's usually better to cache it so we don't read the file twice
rdd.cache()
// Unfortunately, we have to count() to be able to identify the last index
val count = rdd.count()
val result = rdd.zipWithIndex().collect {
case (v, index) if index != 0 && index != count - 1 => v
}
注意,这可能是在性能方面相当昂贵的(如果缓存RDD - 你使用内存;如果你不使用,你可以读RDD两次)。所以,如果你有一个基于其内容(例如,如果你知道所有的记录,但这些应包含一定的模式)的识别这些记录的任何方式,使用filter
可能会更快。
我正与一个可能的解决方案,以更新的问题:我用'拿(data.count - 1)'然后筛选其中'行! = data.first'。对于封面下的火花是如何工作的相当无知,哪种解决方案会更快?这些数据将以任何方式存储在内存中。 – bendl
有一个非常显着的区别 - 'take(data.count - 1)'会将整个RDD收集到_driver_内存(一台机器!),对于大型RDD,这会导致OOM;另一方面,缓存保持RDD _distributed_并将其_partitions_加载到工作节点的内存中(其中有很多潜在的) - 所以你不太可能获得OOM并且任何一种方式都会更快(数据将不必传输给驱动程序)。你只能用'take'来收集相对较少的记录。 –
这可能是一个更轻的版本:
val rdd = sc.parallelize(Array(1,2,3,4,5,6), 3)
val partitions = rdd.getNumPartitions
val rddFirstLast = rdd.mapPartitionsWithIndex { (idx, iter) =>
if (idx == 0) iter.drop(1)
else if (idx == partitions - 1) iter.sliding(2).map(_.head)
else iter
}
scala> rddFirstLast.collect()
res3: Array[Int] = Array(2, 3, 4, 5)
- 1. SED:第一个和最后一个空行不被删除
- 2. C++删除数字的第一个和最后一个数字
- 3. 从txt文件的每一行删除第一个和最后一个字符
- 4. 从文件中删除第一行和最后一行
- 5. 删除第一个NaN后的DataFrame行
- 6. 删除第一个和最后一个反斜杠?
- 7. deleteRange函数只删除第一个和最后一个
- 8. 在星火RDD
- 9. 火鸟:一个月的最后一个星期日
- 10. Spark Scala基于另一个RDD的列删除一个RDD中的行
- 11. 星火RDD删除记录有多个按键
- 12. 更有效的删除第一个和最后一个对象的方法
- 13. Datagridview删除最后一行
- 14. tsql - 删除最后一行
- 15. tableview删除最后一行
- 16. 星火:按多个值的RDD在一个元组/列
- 17. 星火RDD容错
- 18. 星火RDD不Elasticsearch
- 19. 星火RDD写入HBase的
- 20. 删除高图中的第一个和最后一个网格线?
- 21. 删除字符串中的最后一个字符和第一个字符
- 22. 删除C中的链表第一个和最后一个元素
- 23. 如何删除列表的第一个和最后一个元素?
- 24. 删除最后一个空白行
- 25. 获得一个星期的第一天与最后一天
- 26. 当删除最后一个元素,jquery删除第一个元素
- 27. 星火:一个RDD的格式转换成数据帧
- 28. 第一次和最后一次删除双引号失败
- 29. 删除文件的最后一行
- 30. 删除表中的最后一行 - SQL
如果他们按照一定的模式,您可以使用过滤器。 – jamborta
他们不这样做,这是该工具的目的... – bendl