Python 基于行数过滤RDD

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

sc.textFile(path)允许读取HDFS文件,但它不接受参数(如跳过多行,具有_头等)

在“Learning Spark”O'Reilly电子书中,建议使用以下函数读取CSV(示例5-12.Python加载CSV示例)

我的问题是关于如何对“take”行进行选择:

  • 如何避免加载第一行(标题)
  • 如何删除特定行(例如,第5行)
  • 我在这里看到了一些不错的解决方案:但我想看看是否有更简单的解决方案


    谢谢

    不用担心加载不需要的行/行。当您这样做时:

    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()