Python 基于行数过滤RDD
sc.textFile(path)允许读取HDFS文件,但它不接受参数(如跳过多行,具有_头等) 在“Learning Spark”O'Reilly电子书中,建议使用以下函数读取CSV(示例5-12.Python加载CSV示例) 我的问题是关于如何对“take”行进行选择:Python 基于行数过滤RDD,python,csv,apache-spark,Python,Csv,Apache Spark,sc.textFile(path)允许读取HDFS文件,但它不接受参数(如跳过多行,具有_头等) 在“Learning Spark”O'Reilly电子书中,建议使用以下函数读取CSV(示例5-12.Python加载CSV示例) 我的问题是关于如何对“take”行进行选择: 如何避免加载第一行(标题) 如何删除特定行(例如,第5行) 我在这里看到了一些不错的解决方案:但我想看看是否有更简单的解决方案 谢谢 不用担心加载不需要的行/行。当您这样做时: input = sc.textFile(inp
谢谢 不用担心加载不需要的行/行。当您这样做时:
input = sc.textFile(inputFile)
您没有加载该文件。您刚刚得到一个对象,该对象将允许您对文件进行操作。因此,为了提高效率,最好只考虑得到你想要的东西。例如:
header = input.take(1)[0]
rows = input.filter(lambda line: line != header)
请注意,这里我并没有使用索引来指代我想要删除的行,而是指它的值。这有一个副作用,即具有此值的其他行也将被忽略,但更符合Spark的精神,因为Spark会将文本文件分布在节点的不同部分,并且行号的概念在每个分区中丢失。这也是为什么在Spark(Hadoop)中不容易做到这一点的原因,因为每个分区都应该被认为是独立的,全局行号会打破这一假设
如果您真的需要处理行号,我建议您将它们添加到Spark之外的文件中(请参阅),然后在Spark内部按此列过滤
编辑:根据@Daniel Darabos的建议添加了zipWithIndex
解决方案
sc.textFile('test.txt')\
.zipWithIndex()\ # [(u'First', 0), (u'Second', 1), ...
.filter(lambda x: x[1]!=5)\ # select columns
.map(lambda x: x[0])\ # [u'First', u'Second'
.collect()
谢谢Elyase。通过我的编辑,你的代码完成了标题的技巧!您可以使用
RDD.zipWithIndex()
添加行号,然后也可以根据行号进行过滤。(请注意,zipWithIndex
并不便宜。)
sc.textFile('test.txt')\
.zipWithIndex()\ # [(u'First', 0), (u'Second', 1), ...
.filter(lambda x: x[1]!=5)\ # select columns
.map(lambda x: x[0])\ # [u'First', u'Second'
.collect()