Чтение сложных XML-файлов в кодировке base-64 в искровой фрейм данных / - PullRequest
1 голос
/ 07 марта 2019

Я тщательно исследовал эту проблему и не нашел никаких ответов, однако я новичок в Spark и, возможно, что-то пропустил.

Мне дали набор файлов, представляющих собой XML-коды в формате base-64, которые меня попросили преобразовать в кадры данных, чтобы можно было провести некоторый анализ. Я могу их расшифровать:

import base64
decoded = lines.map(lambda l: base64.b64decode(l).decode("utf-8", "ignore"))

А теперь у меня есть объект PipelinedRDD с 15 строками, каждая из которых является строковым представлением очень сложного вложенного XML-файла. Фактический файл, скорее всего, коммерчески чувствителен, но чтобы дать вам представление:

<MessageBody>
    <MessageProperties>
        <SomeProperty>text</SomeProperty>
        <SomeOtherProperty>
            <Code>text</Code>
            <Name>text</Name>
        </SomeOtherProperty>
        <DateTime dateType='Departure'>a date</DateTime>
        <DateTIme dateType='Arrival'>another date</DateTime>

Фактический текст XML, как я уже сказал, гораздо больше. Есть много вложенных свойств, и многие теги имеют одно и то же имя (например, DateTime) с дополнительной информацией, указанной в теге.

Мне известна библиотека spark-xml, но я не знаю, как заставить ее читать строку вместо реального XML-файла или справиться с таким сложным XML-файлом.

Я знаю, что библиотека ElementTree в Python может создавать дерево из строки, но не знаю, как преобразовать это дерево в информационный фрейм, кроме написания некоторой рекурсивной функции, которая принимает все имена тегов (например, DateTime) и дополнительную информацию (например, dateType) = «Прибытие») и присваивает их именам столбцов, а текст внутри (например, «другая дата») значениям, но мне сказали, что это слишком неэффективно и что должен быть способ просто прочитать строку XML в dataframe.

Если это поможет, у меня есть файлы .xsd для XML. Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...