繁体   English   中英

如何获取 csv 文件的子集作为 Spark RDD

[英]How do I get a subset of a csv file as a Spark RDD

我是 Spark 的新手,正在尝试读取 csv 文件并获取文件中的第一列和第二列。 但问题是 csv 文件很大,我对解析 csv 文件中的每一行都不感兴趣。 此外,运行 collect() 函数可能会使进程崩溃,因为内存可能不足以支持返回的数据量。 所以我想知道是否可以创建一个仅包含 csv 数据子集的 RDD。 例如,是否可以生成一个包含 csv 文件第 10 到 1000 行的 RDD 而忽略其他行。

现在,我只有

csvdata = sc.textFile("hdfs://nn:port/datasets/sample.csv").map(lambda line: line.split(","))

这基本上为整个 csv 文件创建了一个 RDD。 是否可以从仅包含第 10 到 1000 行的 csvdata 创建 RDD?

非常感谢您提供的帮助。

您可以全部加载并按索引过滤:

rdd = sc.parallelize(range(0, -10000, -1))
rdd.zipWithIndex().filter(lambda kv: 9 <= kv[1] < 999).keys()

根据您定义第 10 行的方式调整范围。

RDD 不是存储在内存中的数据,它是对某些数据进行处理的意图。 当您调用终端操作时,例如“收集”或“减少”,Spark 会处理数据。 Spark 根据您在 RDD 上的操作历史,在幕后进行了一些巧妙的优化,限制了它必须做的工作量。

(通过在 RDD 上调用一些操作而不是调用终端操作来尝试自己。没有任何反应!)

所以你可以做例如(这是Scala但在python中不太相似)

val first10results: Array[Array[String]] = sc.textFile(filePath)
      .map(f => f.split(","))
      .take(10)

Spark 会知道,因为take(10) ,你只需要前 10 行。 所以它只会从文件中取出 10 行! 简单的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM