#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 вместо пути к файлу. Спасибо 🙂