lxml.etree iterparse не принимает путь к файлу HDFS

#python #pyspark #hdfs #amazon-emr #iterparse

#python #pyspark #hdfs #amazon-emr #iterparse

Вопрос:

Я хотел бы обработать огромный XML-файл, который распространяется по файловой системе HDFS, используя iterparse функцию из lxml.etree пакета.

Я пробовал это локально и в кластере EMR Amazon:

  • Локально: адрес моего XML-файла hdfs://localhost:9000/user/hadoop/history.xml
  • Кластер EMR: адрес равен /user/hadoop/history.xml

В обоих случаях запуск моей простой программы на Python завершается сбоем со следующей ошибкой

 Traceback (most recent call last):
  File "xml_parser.py", line 18, in <module>
    main()
  File "xml_parser.py", line 12, in main
    for event, elem in ET.iterparse(inputFile, tag='page'):
  File "src/lxml/iterparse.pxi", line 78, in lxml.etree.iterparse.__init__
FileNotFoundError: [Errno 2] No such file or directory: <file_path>
  

Вот моя программа на python

 import sys
import lxml.etree as ET
from pyspark import SparkContext
from pyspark.sql import SparkSession



def main():
    sc = SparkContext()
    spark = SparkSession(sc)
    inputFile = sys.argv[1]
    for event, elem in ET.iterparse(inputFile, tag='page'):
        elem.clear()
    print('finished')


if __name__ == "__main__":
    main()
  

Комментарии:

1. Что, если вы просто откроете файл самостоятельно и передадите объект open file в iterparse ?

2. Я пробовал это. Но iterparse принимает только путь к файлу, а не содержимое файла

3. Похоже, это не так. Я смог передать объект file в iterparse без ошибок. Обратите внимание, что вам нужно открыть файл в двоичном режиме ( open("somefile.html", "rb") ).

4. Мой плохой. Я не подумал об этом, передавая файловый объект в iterparse. Действительно, мы можем использовать объект file вместо пути к файлу. Спасибо 🙂