Я пытаюсь загрузить XML-файлы из соединения S3 в задании AWS Glue ETL.Файлы загружаются «правильно», поскольку при создании DynamicFrame из файлов в S3 задание не завершается сбоем.Ошибка возникает при вызове реляционного.Вот обратная трассировка.
Traceback (most recent call last):
File "script_2019-05-01-15-21-13.py", line 83, in <module>
dfc = Relationalize.apply(frame=df_without_null, name=dfc_root_table_name, transformation_ctx='dfc')
File "/mnt/yarn/usercache/root/appcache/application_1556723707401_0001/container_1556723707401_0001_01_000001/PyGlue.zip/awsglue/transforms/transform.py", line 24, in apply
File "/mnt/yarn/usercache/root/appcache/application_1556723707401_0001/container_1556723707401_0001_01_000001/PyGlue.zip/awsglue/transforms/relationalize.py", line 47, in __call__
File "/mnt/yarn/usercache/root/appcache/application_1556723707401_0001/container_1556723707401_0001_01_000001/PyGlue.zip/awsglue/dynamicframe.py", line 336, in relationalize
File "/mnt/yarn/usercache/root/appcache/application_1556723707401_0001/container_1556723707401_0001_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
File "/mnt/yarn/usercache/root/appcache/application_1556723707401_0001/container_1556723707401_0001_01_000001/pyspark.zip/pyspark/sql/utils.py", line 63, in deco
File "/mnt/yarn/usercache/root/appcache/application_1556723707401_0001/container_1556723707401_0001_01_000001/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o82.relationalize.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 239 in stage 3.0 failed 4 times, most recent failure: Lost task 239.3 in stage 3.0 (TID 889, ip-172-32-47-183.ec2.internal, executor 57): scala.MatchError: choice (of class com.amazonaws.services.glue.schema.TypeCode)
at com.amazonaws.services.glue.transforms.Relationalize$$anonfun$traverseCollection$1.apply(Relationalize.scala:629)
at com.amazonaws.services.glue.transforms.Relationalize$$anonfun$traverseCollection$1.apply(Relationalize.scala:623)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
Когда я загружаю файлы в DynamicFrame, я использую вызов create_dynamic_frame_from_options
с опцией форматирования, установленной на xml
.Вот дополнительные параметры подключения и формата, которые я использовал в этом вызове.
Формат:
'rowTag': 'CandidateAdministrationDataRecord'
Соединение:
'paths': path_keys, 'groupFiles': 'inPartition'
path_keys - это списокпути в моем ведре, которые я импортирую.Я отфильтровываю все файлы, которые не являются XML и не содержат данных, которые меня интересуют.
Мое лучшее предположение из всех исследований, которые я провел по этой проблеме, заключается в том, что есть некоторыенесоответствующая структура элементов XML глубоко в одном из файлов.Я видел рекомендации по добавлению следующего в мои параметры формата:
'treatEmptyValuesAsNulls': 'true'
Но я не хочу просто продолжать пытаться и нести расходы, если это не правильный способ решить эту проблему.Пожалуйста, дайте мне знать, если это возможное решение или я что-то упускаю полностью.Спасибо
ОБНОВЛЕНИЕ
Я пытался использовать
treatEmptyValuesAsNulls': True
, но безуспешно.Работа все еще не удалась.Я не уверен, почему это
ОБНОВЛЕНИЕ 2
Так что это было исключение OOM.Я исправил это, загрузив файлы с набором параметров groupSize.Я выбрал значение, играя со значением, и обнаружил, что 50 МБ работают на меня.Вот документация к этому.
Я столкнулся с другой проблемой, однако с пользовательской функцией (UDF) и другим OOM.Я работаю над решением этой проблемы, но ссылка, которая обсуждает эту проблему, здесь
ОБНОВЛЕНИЕ 3
Я решил нетдольше используйте UDF и попробуйте запустить задание со всеми функциональными возможностями.Я пытаюсь переименовать некоторые поля в нижний регистр и удалить «.».Я использую кадры данных для этого вместо Glue DynamicFrame из-за известной проблемы в полях переименования.Я получаю сообщение об ошибке OOM при попытке вызвать dataframe.columns и работаю над исправлением этого