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

时间:2015-10-07 12:16:41

标签: python csv apache-spark

我是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?

非常感谢您提供的帮助。

2 个答案:

答案 0 :(得分:2)

您可以加载所有内容并按索引过滤:

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

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

答案 1 :(得分:0)

RDD并不是存储在内存中的数据,而是打算对某些数据进行处理。当您呼叫终端操作时,例如&#34;收集&#34;或者&#34;减少&#34;然后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行文件!简单。